C# transfer local file to remote server based on File.Copy
程序员文章站
2022-06-29 14:17:58
based on https://*.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials ......
using system; using system.collections.generic; using system.componentmodel; using system.linq; using system.runtime.interopservices; using system.text; using system.threading.tasks; namespace tfcp { /// <summary> /// provides access to a network share. /// </summary> public class networkshareaccesser : idisposable { private string _remoteuncname; private string _remotecomputername; public string remotecomputername { get { return this._remotecomputername; } set { this._remotecomputername = value; this._remoteuncname = @"\\" + this._remotecomputername; } } public string username { get; set; } public string password { get; set; } #region consts private const int resource_connected = 0x00000001; private const int resource_globalnet = 0x00000002; private const int resource_remembered = 0x00000003; private const int resourcetype_any = 0x00000000; private const int resourcetype_disk = 0x00000001; private const int resourcetype_print = 0x00000002; private const int resourcedisplaytype_generic = 0x00000000; private const int resourcedisplaytype_domain = 0x00000001; private const int resourcedisplaytype_server = 0x00000002; private const int resourcedisplaytype_share = 0x00000003; private const int resourcedisplaytype_file = 0x00000004; private const int resourcedisplaytype_group = 0x00000005; private const int resourceusage_connectable = 0x00000001; private const int resourceusage_container = 0x00000002; private const int connect_interactive = 0x00000008; private const int connect_prompt = 0x00000010; private const int connect_redirect = 0x00000080; private const int connect_update_profile = 0x00000001; private const int connect_commandline = 0x00000800; private const int connect_cmd_savecred = 0x00001000; private const int connect_localdrive = 0x00000100; #endregion #region errors private const int no_error = 0; private const int error_access_denied = 5; private const int error_already_assigned = 85; private const int error_bad_device = 1200; private const int error_bad_net_name = 67; private const int error_bad_provider = 1204; private const int error_cancelled = 1223; private const int error_extended_error = 1208; private const int error_invalid_address = 487; private const int error_invalid_parameter = 87; private const int error_invalid_password = 1216; private const int error_more_data = 234; private const int error_no_more_items = 259; private const int error_no_net_or_bad_path = 1203; private const int error_no_network = 1222; private const int error_bad_profile = 1206; private const int error_cannot_open_profile = 1205; private const int error_device_in_use = 2404; private const int error_not_connected = 2250; private const int error_open_files = 2401; #endregion #region pinvoke signatures [dllimport("mpr.dll")] private static extern int wnetuseconnection( intptr hwndowner, netresource lpnetresource, string lppassword, string lpuserid, int dwflags, string lpaccessname, string lpbuffersize, string lpresult ); [dllimport("mpr.dll")] private static extern int wnetcancelconnection2( string lpname, int dwflags, bool fforce ); [structlayout(layoutkind.sequential)] private class netresource { public int dwscope = 0; public int dwtype = 0; public int dwdisplaytype = 0; public int dwusage = 0; public string lplocalname = ""; public string lpremotename = ""; public string lpcomment = ""; public string lpprovider = ""; } #endregion /// <summary> /// creates a networkshareaccesser for the given computer name. the user will be promted to enter credentials /// </summary> /// <param name="remotecomputername"></param> /// <returns></returns> public static networkshareaccesser access(string remotecomputername) { return new networkshareaccesser(remotecomputername); } /// <summary> /// creates a networkshareaccesser for the given computer name using the given domain/computer name, username and password /// </summary> /// <param name="remotecomputername"></param> /// <param name="domainorcomutername"></param> /// <param name="username"></param> /// <param name="password"></param> public static networkshareaccesser access(string remotecomputername, string domainorcomutername, string username, string password) { return new networkshareaccesser(remotecomputername, domainorcomutername + @"\" + username, password); } /// <summary> /// creates a networkshareaccesser for the given computer name using the given username (format: domainorcomputername\username) and password /// </summary> /// <param name="remotecomputername"></param> /// <param name="username"></param> /// <param name="password"></param> public static networkshareaccesser access(string remotecomputername, string username, string password) { return new networkshareaccesser(remotecomputername, username, password); } private networkshareaccesser(string remotecomputername) { remotecomputername = remotecomputername; this.connecttoshare(this._remoteuncname, null, null, true); } private networkshareaccesser(string remotecomputername, string username, string password) { remotecomputername = remotecomputername; username = username; password = password; this.connecttoshare(this._remoteuncname, this.username, this.password, false); } private void connecttoshare(string remoteunc, string username, string password, bool promptuser) { netresource nr = new netresource { dwtype = resourcetype_disk, lpremotename = remoteunc }; int result; if (promptuser) { result = wnetuseconnection(intptr.zero, nr, "", "", connect_interactive | connect_prompt, null, null, null); } else { result = wnetuseconnection(intptr.zero, nr, password, username, 0, null, null, null); } if (result != no_error) { throw new win32exception(result); } } private void disconnectfromshare(string remoteunc) { int result = wnetcancelconnection2(remoteunc, connect_update_profile, false); if (result != no_error) { throw new win32exception(result); } } /// <summary> /// performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> /// <filterpriority>2</filterpriority> public void dispose() { this.disconnectfromshare(this._remoteuncname); } } } static void pathcopytoremotedemo() { string destfile = @"\\remotepcname\sharedfile"; string sourcefile = @"c:\myfolder\mytxt.txt"; string filename = path.getfilename(sourcefile); string remotepcname = "remotepcname"; string remotepcdomainname = "remotepcdomainname"; string remotepcusername = "remotepcpassword"; string remotepcuserpwd = "remotepcuserpwd"; string destfullname = path.combine(destfile, filename); using (networkshareaccesser.access(remotepcname, remotepcdomainname, remotepcusername, remotepcuserpwd)) { file.copy(sourcefile, destfullname); } }
based on
下一篇: 四川特产辣椒油品牌,千万不要错过的品牌