1398-03-03 17:35 نحوه اتصال به ذخیره ساز تحت شبکه
zahmah

 
دوستان کسی هست کمک کنه؟
یک هارد(ذخیره ساز 24 ترا) تحت شبکه هست میخوام عملیات ایجاد پوشه، کپی پوشه و ... رو روش انجام بدم. تا حدی مبتدی هستم. اگه کسی کدشو میدونه لطف کنه راهنمایی کنه
1398-03-04 22:37
zahmah

 
کسی نیس کمک کنه؟؟؟؟
1398-03-04 23:21
حاجی شریفی
مؤسس سایت
 
سلام
یعنی میخواهید به یک استوریج NAS متصل شوید.
خوشبختانه مشکل خاصی ندارید ، کافی است با مسیر دهی عادی شبکه کار کنید...
مثلا
System.IO.Directory.CreateDirectory(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1" ) ;

System.IO.Directory.Move(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1", @"\\SERVER_NAME_OR_IP\ROOT\New Folder2" ) ;

System.IO.File.WriteAllText(@"\\SERVER_NAME_OR_IP\ROOT\New Folder2\file.txt", "HELLO!" ) ;


و در ضمن میتوانید استوریج را به یک درایومجازی (مانند Z) در رایانه تان Map کنید وسپس مانند درایوهای عادی با آن رفتار کنید.
برای MapDrive میتوانید از MyComputer گزینه مربوطه را کلیک کنید:


یا از فرمانی شبیه این استفاده کنید:
net use Z: \\SERVER_NAME_OR_IP\ROOT


و سپس طبق یک درایو عادی در دات نت کد بزنید:
System.IO.Directory.CreateDirectory(@"Z:\New Folder1" ) ;

System.IO.Directory.Move(@"Z:\New Folder1", @"Z:\New Folder2" ) ;

System.IO.File.WriteAllText(@"Z:\New Folder2\file.txt", "HELLO!" ) ;

این روش هم بد نیست، چون در واقع بحث IP و مسیر و User,Pass احتمالی را از برنامه تان خارج میکنید و تنظیم آن را به محیط عادی ویندوز واگذار میکنید.
درهرصورت هر دو روش در دسترس تان است.
موفق باشید.
1398-03-08 23:11
zahmah

 
ممنون تستش میکنم ولی به هر حال ممنون از راهنمائی تون.
تشکر
1398-03-08 23:15
zahmah

 
راستی یوزر پسورد رو چطور رد کنه؟
1398-03-09 13:27
حاجی شریفی
مؤسس سایت
 
سلام
پیشنهاد اولم آن است که از همان MapDrive استفاده کنید و مدیریت این جزییات را به ویندوز واگذار کنید.
هم میتوانید از دیالوگ مربوطه در MyComputer استفاده کنید و هم از خط فرمان net use استفاده کنید.
حتی می توانید فرمان را با CSharp وتابع Process.Start هم اجرا کنید !
برقراری نگاشت
NET USE Z: \\SERVER_NAME_OR_IP\ROOT /USER:username password /PERSISTENT:YES

لغو نگاشت
NET USE Z: /DELETE

البته باید در خصوص اجرای RunAsAdmin فرمان فوق دقت کنید و تحت همان مجوزی آن را اجرا کنید که برنامه قرار است اجرا شود.


ولی اگر به کار بدون MapDrive مصر هستید ، برای احراز هویت باید از تابع WNetAddConnection2 ( لینک 1 و لینک 2 ) استفاده کنید.
که معمولا افراد یک کلاس کوچک دستی به نام NetworkConnection می سازند تا این امر را انجام دهد.
using  System.Runtime.InteropServices;

public class NetworkConnection
: IDisposable
{
[DllImport("mpr.dll" )]
private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flags);

[DllImport("mpr.dll" )]
private static extern int WNetCancelConnection2(string name, int flags, bool force);

private readonly string m_Path;

public NetworkConnection(string path, string user, string pass)
{
this .m_Path = path;

var netResource = new NetResource()
{
Scope = 0x2, //GlobalNetwork
ResourceType = 0x1, //Disk
DisplayType = ResourceDisplaytype.Share,
RemoteName = this.m_Path
};

int result = WNetAddConnection2(
netResource,
pass,
user,
0);

if (result == 0) return ;
throw new System.ComponentModel.Win32Exception(result);
}

protected virtual void Dispose(bool disposing)
{
WNetCancelConnection2(this .m_Path, 0, true );
}

public void Dispose()
{
this .Dispose(true );
GC.SuppressFinalize(this );
}

~NetworkConnection()
{
this .Dispose(false );
}

[StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public int Scope;
public int ResourceType;
public ResourceDisplaytype DisplayType;
public int Usage;
public string LocalName;
public string RemoteName;
public string Comment;
public string Provider;
}
public enum ResourceDisplaytype : int
{
Generic = 0x0,
Domain = 0x01,
Server = 0x02,
Share = 0x03,
File = 0x04,
Group = 0x05,
Network = 0x06,
Root = 0x07,
Shareadmin = 0x08,
Directory = 0x09,
Tree = 0x0a,
Ndscontainer = 0x0b
}
}


که با کدی شبیه این قابل استفاده خواهد بود:
using  (new  NetworkConnection(@"\\SERVER_NAME_OR_IP\ROOT", "username", "password" ))
{
System.IO.Directory.CreateDirectory(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1" ) ;

System.IO.Directory.Move(@"\\SERVER_NAME_OR_IP\ROOT\New Folder1", @"\\SERVER_NAME_OR_IP\ROOT\New Folder2" ) ;

System.IO.File.WriteAllText(@"\\SERVER_NAME_OR_IP\ROOT\New Folder2\file.txt", "HELLO!" ) ;
}
1398-03-09 13:44
zahmah

 
خیلی عالی
انشاءالله جواب میده. کد قبلی تون جواب داد
بی نهایت ممنون.