PDA

View Full Version : برنامه دانلود از FTP



tanha70
پنج شنبه 13 فروردین 1394, 22:23 عصر
سلام

دوستان من نیازمند کلاس/برنامه ای هستم که به وسیله اون بتونم به راحتی تمام فایل های موجود در یک FTP رو دانلود کنم.
ممنون میشم راهنمایی بفرمایید.

am_al_59
پنج شنبه 13 فروردین 1394, 22:45 عصر
با این کد میتونی فهرست فایل های یک آدرس FTP رو بگیری

FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://address/");
ftpReq.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();
Stream responseStream = ftpRes.GetResponseStream();
string listFilesDirectories = new StreamReader(responseStream).ReadToEnd();

با این کد هم میتونی یک فایل رو دانلود کنی


FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://fileAddress");
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();
Stream downloadStream = ftpRes.GetResponseStream();
byte[] readBytes = new byte[downloadStream.Length];
downloadStream.Read(readBytes, 0, readBytes.Length);
downloadStream.Close();
FileStream saveFileStream = File.Create("downloadFile");
saveFileStream.Write(readBytes, 0, readBytes.Length);
saveFileStream.Close();
ftpRes.Close();

tanha70
پنج شنبه 13 فروردین 1394, 22:52 عصر
user و pass رو کجا باید بدیم؟
اینم فک کنم باید تغییر کنه
چون یه آرایه باید باشه.



string listFilesDirectories = new StreamReader(responseStream).ReadToEnd();

am_al_59
پنج شنبه 13 فروردین 1394, 23:08 عصر
اگر یوزر و پسورد داره باید بعد از خط


FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://address/");

این خطو قرار بدی


ftpReq.Credentials = new NetworkCredential ("user","pass");


خروجی دریافت فهرست فایل ها یک رشته پیوسته هست
اول خروجی رو بگیر وقتی ببینی به راجتی میتونی کد استخراج نام فایل رو ازش بنویسی
برای اینکه رشته لیست کامل رو به آدرس هر فایل بشکنی باید از متد Split استفاده کنی و اونو بر اساس "\n" یا "\r\n" بشکنی

نمونش اینه


listFilesDirectories.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

tanha70
پنج شنبه 13 فروردین 1394, 23:10 عصر
لطفا یه بار دیگه کدها رو قرار بدین
مشکل دارن.

am_al_59
پنج شنبه 13 فروردین 1394, 23:15 عصر
ببخشید مال ادیتورش بود شایدم مال Browser منه بعضی وقتا گیج میزنه
اصلاح شد

tanha70
جمعه 14 فروردین 1394, 00:18 صبح
من آخر سر میخوام تمام فایل های موجود در یک FTP رو با یه کلیک دانلود کنم تو یه مسیر خاص.

am_al_59
جمعه 14 فروردین 1394, 00:39 صبح
الان شما دستورات دریافت لیست از FTP رو دارین
برای استخراج نام فایل ها هم گه دقیق گفتم چیکار کنین تا آرایه به دست بیارین
دستوران دانلود یک فایل از FTP رو هم که گفتم
فقط کافیه در رویداد کلید مورد نظرتون با یک حلقه for یا foreach فایلهارو دانلود کنین
بفرمایین اینم کد حلقش:

private void button1_Click(object sender, EventArgs e)
{
foreach (string item in filesList)
{
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://siteAddress/"+item);
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();
Stream downloadStream = ftpRes.GetResponseStream();
byte[] readBytes = new byte[downloadStream.Length];
downloadStream.Read(readBytes, 0, readBytes.Length);
downloadStream.Close();
FileStream saveFileStream = File.Create("localAddress\\"+item);
saveFileStream.Write(readBytes, 0, readBytes.Length);
saveFileStream.Close();
ftpRes.Close();
}
}



در مثال بالا filesList همون آرایه ای هست که شما از روی رشته لیست فایل ها طبق مواردی که گفتم به دست آوردین

tanha70
جمعه 14 فروردین 1394, 00:51 صبح
تشکر بسیار از اینکه وقت گذاشتین.
ولی این ارور رو میده!!!

This stream does not support seek operations.

am_al_59
جمعه 14 فروردین 1394, 01:04 صبح
خواهش میکنم
فکر کنم اون خطا به خاطر این باشه که استریمی که برای دریافت از FTP نمیتونه طول کامل رو بر گردونه و منم برای خواندن فایل یک آرایه از بایت ها گذاشتم.
این مشکلو میشه با یک stream دیگه مثل streamReader حل کرد

قسمت


byte[] readBytes = new byte[downloadStream.Length];
downloadStream.Read(readBytes, 0, readBytes.Length);


را تغییر بدین به

int readByte = downloadStream.ReadByte();
while (readByte != -1)
{
saveFileStream.WriteByte(Convert.ToByte(readByte)) ;
readByte = downloadStream.ReadByte();
}


به این هم میتونین تغییر بدین و ساده تره


StreamReader downloadStream = new StreamReader(ftpRes.GetResponseStream());
StreamWriter saveFileStream = new StreamWriter("downloadFile");
saveFileStream.Write(downloadStream.ReadToEnd());

tanha70
جمعه 14 فروردین 1394, 11:19 صبح
ممنون
یه سوال دیگه
خوب listFilesDirectories میاد تمام اطلاعات فایل ها موجود در ftp رو برمیگردونه. در صورتی که تنها نام فایل ها برامو مهمه و ویژگی های دیگش که مهم نیست.اینو چه کار کنیم؟

am_al_59
جمعه 14 فروردین 1394, 12:52 عصر
خروجیتونو بزارین

tanha70
جمعه 14 فروردین 1394, 13:30 عصر
drwxr-xr-x 5 testftp testftp 4096 Apr 2 14:44 .
drwxr-xr-x 5 testftp testftp 4096 Apr 2 14:44 ..
-rw------- 1 testftp testftp 4 Apr 2 04:01 .ftpquota
drwxr-xr-x 2 testftp testftp 4096 Apr 1 12:10 1
-rw-r--r-- 1 testftp testftp 0 Apr 1 12:18 142633253392.jpg
drwxr-xr-x 2 testftp testftp 4096 Apr 1 12:10 2
drwxr-xr-x 2 testftp testftp 4096 Apr 1 12:19 etc
-rw-r--r-- 1 testftp testftp 793765 Apr 2 14:34 module.png
-rw-r--r-- 1 testftp testftp 962 Apr 2 14:44 notes.txt

am_al_59
جمعه 14 فروردین 1394, 13:52 عصر
اوه اوه واسه این داستان داری
ممکنه خروجیت روی هر سروری فرق کنه :عصبانی++::گریه:
اگر بخوای حرفه ای بشه باید از Regular Expression استفاده کنی.
توی همین خروجی اگر بخوای مثلاً مجوز هارو بدست بیاری Regular Expression میشه

([\-xrw]{8})

ببین اگر خودت میتونی بنویسی بنویس منم دعات میکنم
اگرنه شکل خروجیتو کامل با اسم ستون هاش دقیقاً همونطور که از سرور FTP میگیری به صورت Text بزار یکی دوساعتی هم مهلت بده کد کاملشو بنویسم بزارم شاید به درد بقیه هم خورد

tanha70
جمعه 14 فروردین 1394, 14:06 عصر
خدا خیرت بده.
مشکل منم همینه دقیقا.
دیگه فک کنم دست خودتو ببوسه چون من خیلی آشنا نیستم.

am_al_59
جمعه 14 فروردین 1394, 14:07 عصر
شکل خروجیتو کامل با اسم ستون هاش دقیقاً همونطور که از سرور FTP میگیری به صورت Text بزار

tanha70
جمعه 14 فروردین 1394, 14:16 عصر
همونی که تو پست قبلی فرستادم خروجی دقیقش بود.
واسه تست اگر خودتون FTP دیگه ای دارید میتونید تست کنید.
ولی دقیقا همین بود.

am_al_59
جمعه 14 فروردین 1394, 14:42 عصر
در این کد من خروجی رو از یک فایل Text خوندم نتیجه روهم توی آدرس برنامه توی فایل result.txt ریختم
حالا شما اون رشته خام اولیه رو میتونین از هرجا بخواهید بگیرین
بفرمایین کدش این میشه


StreamReader sr = new StreamReader("textFile1.txt");
string[] filesListArray = sr.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
sr.Close();
string regularExpression =
@"^([\-d])" +
@"([\-xwr]{9})" +
@"\s+" +
@"(\d+)" +
@"\s+" +
@"(\w+)" +
@"\s+" +
@"(\w+)" +
@"\s+" +
@"(\d+)" +
@"\s+" +
@"(\w{3})" +
@"\s+" +
@"(\d{1,2})" +
@"\s+" +
@"([\d:]{4,5})" +
@"\s+" +
@"(?<nameColumn>(.*))" +
@"$";
StreamWriter sw = new StreamWriter("result.txt");
foreach (string item in filesListArray)
{
var result = new Regex(regularExpression).Match(item);
sw.WriteLine(result.Groups["nameColumn"].ToString());
};
sw.Close();

tanha70
جمعه 14 فروردین 1394, 15:31 عصر
دستون درد نکنه
خروجی فایل بالا به این صورت میشه


.
..
.ftpquota
1
142633253392.jpg
2
etc
module.png
notes.txt


۳تای اول که هیچ. از چهارمین سطر باید دانلود بشن . ولی یکیش به نام etc یه دایرکتوری هست و ما باید اینو تشخیص بدیم و به صورت بازگشتب تمام فایل های موجود در این دایرکتوری رو هم دانلود کنیم :دی

am_al_59
جمعه 14 فروردین 1394, 15:39 عصر
توی خروجی شما دایرکتوری با d و فایل با - مشخص میشه
توی همون خط اول تشخیص میده. میتونین مثل ستون فایل که براش گروه تعریف کردم یک عبارت برای خودتون به نام دلخواه بنویسین و نوعش رو چک کنین
تشخیص دایرکتوری در همون خط اول با کد زیر مشخص میشه

"([\-d])"

tanha70
یک شنبه 16 فروردین 1394, 15:59 عصر
یعنی میفرمایید این کد رو استفاده کنم خروجی بهم میده؟



StreamReader sr = new StreamReader("textFile1.txt");
string[] filesListArray = sr.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
sr.Close();
string regularExpression =
@"^([\-d])" ;

StreamWriter sw = new StreamWriter("result.txt");
foreach (string item in filesListArray)
{
var result = new Regex(regularExpression).Match(item);
sw.WriteLine(result.Groups["nameColumn"].ToString());
};
sw.Close();

am_al_59
یک شنبه 16 فروردین 1394, 17:35 عصر
خط گروه رو تبدیل کنید به
^(?<isDirectory>[\-d])