PDA

View Full Version : کپی یک فولدر با استفاده از Background Worker



HOSSEINONLINE7
شنبه 16 شهریور 1392, 16:55 عصر
سلام من میخوام یک فولدر را از یک مسیری توی مسیر دیگری کپی کنم و درصد اونم با کمک بگراند ورکر و پروگرس بار نشون بدم و نکته ی اصلیش اینجاست که میخوام مسیر پوشه ی مبدا مقصد را جای دیگه بدست بیارم و موقع شروع عملیات به بکگراند ورکر ارسال کنم .

توی گوگل سورس کد های مختلف را دیدم ولی بیشترشون بازگشتی بودن و نمیشد پارامتر به بگراند ورکر ارسال کرد و منم هر کاری کردم نشد ...

لطفا راهنمایی کنید .

m_ali_gho
شنبه 16 شهریور 1392, 17:04 عصر
فراخوانی

backgroundWorker1.RunWorkerAsync(/*مسیر پوشه*/);

و

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string address = (string)e.Argument;
}

HOSSEINONLINE7
شنبه 16 شهریور 1392, 22:09 عصر
فراخوانی

backgroundWorker1.RunWorkerAsync(/*مسیر پوشه*/);

و

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string address = (string)e.Argument;
}

مرسی ولی من اینو میدونم و مشکلم اینه که چطوری 2 تا آرگومان به بگراند ورکر بفرستم(یکی مسیر مبدا و یکی مقصد ) ؟

sohil_ww
شنبه 16 شهریور 1392, 22:11 عصر
یه ارگومان بفرست و با متد اسپلیتر به دو استرینگ تبدیل کن ببین شدنی هست یا نه

plus
شنبه 16 شهریور 1392, 22:48 عصر
مرسی ولی من اینو میدونم و مشکلم اینه که چطوری 2 تا آرگومان به بگراند ورکر بفرستم(یکی مسیر مبدا و یکی مقصد ) ؟

میتونید یک struct تعریف کنید و اطلاعات رو توی یک متغیر از اون نوع ارسال کنید:

struct DirectoryCopyInfo
{
public string Source;
public string Destination;
}
..
..
DirectoryCopyInfo directoryCopyInfo = new DirectoryCopyInfo() { Source = @"D:\Folder1", Destination = @"C:\Folder2", };
backgroundWorker1.RunWorkerAsync(directoryCopyInfo );
..
..
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DirectoryCopyInfo directoryCopyInfo = (DirectoryCopyInfo)e.Argument;
// Copy from directoryCopyInfo.Source to directoryCopyInfo.Destination
}

m_ali_gho
شنبه 16 شهریور 1392, 23:04 عصر
چرا موضوع رو سختش میکنید؟
چرا شما از یک آرایه ای از رشته ها استفاده نمیکنید که 2 تا عضو داشته باشه . مثل:

string[] str=new string[2];

عضو اول مسیر مبدا و عضو دوم هم مسیر مقصد.

HOSSEINONLINE7
یک شنبه 17 شهریور 1392, 14:49 عصر
دوستان مرسی ولی لطفا یک نگاه به کد من بندازید :

private void worker_DoWork(DirectoryInfo source, DirectoryInfo destination)
{


if (!destination.Exists)
{
destination.Create();
}

// Copy all files.
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files)
{
file.CopyTo(Path.Combine(destination.FullName,
file.Name));
}

// Process subdirectories.
DirectoryInfo[] dirs = source.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
// Get destination directory.
string destinationDir = Path.Combine(destination.FullName, dir.Name);




// Call CopyDirectory() recursively.

worker_DoWork(dir, new DirectoryInfo(destinationDir));



}


تابع من بازگشتی هست و فقط باید پارامتر ها بهش ارسال بشه که توی تابع do work توی source , destination قرار بگیره و با روشهایی که شما گفتید نمیشه .

من خیلی سرچ کردم ولی کدی که دایرکتوری کپی کنه و بازگشتی نباشه پیدا نکردم همه ی این مشکلات بخاطر بازگشتی بودن این کده ...

این کد توی یک تابع معمولی خوب کار میکنه ولی توی بکگراند ورکر بخاطر محدودیت ارسال پارامتر کار نمیکنه ...

باید چکار کنم ؟ خیلی وقته نتونستم این مشکل را حل کنم لطفا راهنمایی کنید ...

HOSSEINONLINE7
سه شنبه 19 شهریور 1392, 11:12 صبح
دوستان اگر ممکنه یک راهنمایی بکنید ...