PDA

View Full Version : سوال: کپی کردن فولدر و تمام محتویات داخل آن با استفاده از توابع کتابخانه ای ویندوز ( API )



forodo
چهارشنبه 18 دی 1392, 12:42 عصر
سلام
چطور می تونم با استفاده از توابع کنابخانه ای ویندوز فایلها و فولدرهای داخل یک فولدر رو کپی کنم؟
کپی خود ویندوز با استفاده از یکی از اون dllها انجام می شه.
با تشکر

shahryari
چهارشنبه 18 دی 1392, 13:00 عصر
سلام
خود دات نت امکان کپی فولدر رو داره دیگه چه نیازی به api هست؟
به هر حال اینو تست کن
Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "xcopy.exe";
proc.StartInfo.Arguments = @"C:\source C:\destination /E /I";
proc.Start();

البته هیچکدام جای My را در vb.net نمیگیره
my.computer.filesystem

forodo
چهارشنبه 18 دی 1392, 13:07 عصر
چون من همونی هستم که آیکون فولدرم بعد از کپی رو فولدرم نبود.
گفتم با توابع خود ویندوز باشه، چون به احتمال خیلی زیاد با اون کپی آیکون فولدرم بعد از کپی روی فولدر خواهد بود. یعنی دارم انگار با ویندوز کپی می کنم.

اینم یه سایته (http://www.pinvoke.net/index.aspx) مخصوص توابع API که من چون خیلی با این توابع آشنا نیستم زیاد به کارم نیومد ولی سایت هیولاییه.
البته با copyfile از توبع kernel32 کار کردم ولی توی مقصد چیزی نبود.

forodo
چهارشنبه 18 دی 1392, 13:12 عصر
من اینجوری نوشتم ولی یه صفحه سیاه میاد و میره و هیچ اتفاقی نمی افته:

Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "xcopy.exe";
proc.StartInfo.Arguments = @"C:\Ice Age C:\New folder /E /I";
proc.Start();

drsina
چهارشنبه 18 دی 1392, 13:26 عصر
سلام . برام جالبه بدونم برای چی می خوای از Api استفاده کنی ؟
به هر حال کاری که می خوای انجام بدی ، استفاده از ای پی آی به وسیله ی دات نت هست . خب دیگه چه نیاز به ای پی آی هست ؟

forodo
چهارشنبه 18 دی 1392, 13:37 عصر
سلام . برام جالبه بدونم برای چی می خوای از Api استفاده کنی ؟
به هر حال کاری که می خوای انجام بدی ، استفاده از ای پی آی به وسیله ی دات نت هست . خب دیگه چه نیاز به ای پی آی هست ؟
به دو دلیل که واقعاً کچلم کرده و از دیشب تا حالا اینترنت رو با سواد انگلیسی کمم قورت دادم ولی چیزی پیدا نکردم:
1- در این تاپیک (http://barnamenevis.org/showthread.php?435333-%D8%A7%D8%B2-%D8%A8%DB%8C%D9%86-%D8%B1%D9%81%D8%AA%D9%86-%D8%A2%DB%8C%DA%A9%D9%88%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%DA%A9%D9%BE%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1) سوالی طرح کردم مبنی بر اینکه وقتی فولدری رو کپی می کنم، در مقصد آیکونی که روی فولدر داشتم وجود ندارد که دوست عزیزمون shahryari (http://barnamenevis.org/member.php?246498-shahryari) راهنماییهایی کردند ولی به نتیجه ای نرسیدم.
2- در این یکی تاپیک (http://barnamenevis.org/showthread.php?435322-%D8%B9%D8%AF%D9%85-%DA%A9%D9%BE%DB%8C-%D8%B4%D8%AF%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1%DB%8C-%DA%A9%D9%87-%D8%B2%DB%8C%D8%B1%D8%B4%D8%A7%D8%AE%D9%87-%D9%87%D8%A7%DB%8C%D8%B4-%DA%A9%D9%BE%DB%8C-%D8%B4%D8%AF%D9%87-%D8%A7%D8%B3%D8%AA) سوال دیگرم این بود که وقتی فولدری رو کپی می کنم، مثلاً فولدر ali رو کپی می کنم، تمام فایلها و فولدرهای داخلش کپی می شوند ولی خود فولدر ali در مقصد وجود ندارد.

حالا با راست کلیک روی مثلاً فولدر ali در ویندوز و کپی کردن آن در جای دیگر هم آیکونی که روی فولدر وجود دارد در مقصد هست و هم خود فولدر ali هم در مقصد وجود دارد، به این دلایل می خوام از توابع API استفاده کنم.
اگر تازه باز این مشکلات نباشه که فکر می کنم حل بشه.
با تشکر

maythamahmadi
چهارشنبه 18 دی 1392, 14:22 عصر
دوستان یه سوال داشتم.تو این دستور پارامتر E/ , و I/ چه کاری رو انجام میدن؟؟

shahryari
چهارشنبه 18 دی 1392, 16:19 عصر
من اینجوری نوشتم ولی یه صفحه سیاه میاد و میره و هیچ اتفاقی نمی افته:

Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "xcopy.exe";
proc.StartInfo.Arguments = @"C:\Ice Age C:\New folder /E /I";
proc.Start();

من اون رو تبدیل به روال کردم که میتونید ازش استفاده کنید
public void Copy_file(string source, string target)
{
char d = (Char)34;
source = d + source + d;
target = d + target + d;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "xcopy.exe";
proc.StartInfo.Arguments = source + " " + target + " /E /I";
proc.Start();
}
اینجوری هم ازش استفاده کن:
Copy_file(@"C:\Ice Age", "@C:\New folder");

forodo
چهارشنبه 18 دی 1392, 18:14 عصر
من اون رو تبدیل به روال کردم که میتونید ازش استفاده کنید
public void Copy_file(string source, string target)
{
char d = (Char)34;
source = d + source + d;
target = d + target + d;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "xcopy.exe";
proc.StartInfo.Arguments = source + " " + target + " /E /I";
proc.Start();
}
اینجوری هم ازش استفاده کن:
Copy_file(@"C:\Ice Age", "@C:\New folder");
ممنون.
ولی هیچ کدوم از مشکلاتم حل نشد. ( 1- آیکون فولدر 2- خود فولدر اصلی )
لطفاً کپی کردن فولدر و زیرشاخه هاش رو با API بگید.
با تشکر

این صفحه میاد و بعد از پایان کپی خودش بسته می شه ولی همونطوری که عرض کردم درست نشد.
115074

fmehrvarzi
دوشنبه 23 دی 1392, 21:47 عصر
تو این سایت یک نمونه گذاشته شده است:
XCOPY Using C# to Copy Files/Folders (http://www.c-sharpcorner.com/UploadFile/jawedmd/xcopy-using-C-Sharp-to-copy-filesfolders/)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
namespace Xcopy
{
/// <summary>
/// Use This class to Perform Xcopy
/// </summary>
class Program
{
/// <summary>
/// This is your Main
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//Provide the Source location
string sourceLoc = @"D:\BackUpFile\";
//Provide your Destination Location
string destinationLoc = System.Environment.CurrentDirectory.Remove(System. Environment.CurrentDirectory.IndexOf("bin")) + "Source\\";
string FolderPath = "CopiedFiles";
if (!(Directory.Exists(destinationLoc + @"\" + FolderPath)))
Directory.CreateDirectory(destinationLoc + @"\" + FolderPath);
//Call a method to perform Xcopy
ProcessXcopy(sourceLoc, destinationLoc + @"\" + FolderPath);

Console.WriteLine("we are done with the xcopy");

}

/// <summary>
/// Method to Perform Xcopy to copy files/folders from Source machine to Target Machine
/// </summary>
/// <param name="SolutionDirectory"></param>
/// <param name="TargetDirectory"></param>
private static void ProcessXcopy(string SolutionDirectory, string TargetDirectory)
{
// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
//Give the name as Xcopy
startInfo.FileName = "xcopy";
//make the window Hidden
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
//Send the Source and destination as Arguments to the process
startInfo.Arguments = "\"" + SolutionDirectory + "\"" + " " + "\"" + TargetDirectory + "\"" + @" /e /y /I";
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
exeProcess.WaitForExit();
}
}
catch (Exception exp)
{
throw exp;
}

}
}
}

sorena2000
دوشنبه 23 دی 1392, 23:12 عصر
خودت که لینک گذاشتی برای Api اینجا با 1 sample بهت نشون داده

http://www.pinvoke.net/default.aspx/kernel32.CopyFileEx

forodo
سه شنبه 24 دی 1392, 16:36 عصر
تو این سایت یک نمونه گذاشته شده است:
XCOPY Using C# to Copy Files/Folders (http://www.c-sharpcorner.com/UploadFile/jawedmd/xcopy-using-C-Sharp-to-copy-filesfolders/)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
namespace Xcopy
{
/// <summary>
/// Use This class to Perform Xcopy
/// </summary>
class Program
{
/// <summary>
/// This is your Main
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//Provide the Source location
string sourceLoc = @"D:\BackUpFile\";
//Provide your Destination Location
string destinationLoc = System.Environment.CurrentDirectory.Remove(System. Environment.CurrentDirectory.IndexOf("bin")) + "Source\\";
string FolderPath = "CopiedFiles";
if (!(Directory.Exists(destinationLoc + @"\" + FolderPath)))
Directory.CreateDirectory(destinationLoc + @"\" + FolderPath);
//Call a method to perform Xcopy
ProcessXcopy(sourceLoc, destinationLoc + @"\" + FolderPath);

Console.WriteLine("we are done with the xcopy");

}

/// <summary>
/// Method to Perform Xcopy to copy files/folders from Source machine to Target Machine
/// </summary>
/// <param name="SolutionDirectory"></param>
/// <param name="TargetDirectory"></param>
private static void ProcessXcopy(string SolutionDirectory, string TargetDirectory)
{
// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
//Give the name as Xcopy
startInfo.FileName = "xcopy";
//make the window Hidden
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
//Send the Source and destination as Arguments to the process
startInfo.Arguments = "\"" + SolutionDirectory + "\"" + " " + "\"" + TargetDirectory + "\"" + @" /e /y /I";
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
exeProcess.WaitForExit();
}
}
catch (Exception exp)
{
throw exp;
}

}
}
}
با این هم اون 2تا مشکلم رفع نشد.

forodo
سه شنبه 24 دی 1392, 16:38 عصر
خودت که لینک گذاشتی برای Api اینجا با 1 sample بهت نشون داده

http://www.pinvoke.net/default.aspx/kernel32.CopyFileEx
این برای فایل هستش ولی من برای فولدر و فایل می خوام.

sagggad
سه شنبه 24 دی 1392, 16:51 عصر
شما به وسیله ی تابع FileCopy میتونید یک فایل را در محلی خاص کپی کنید.
آرگومان اول محل فایلی است که باد کپی شود
آرگومان دوم محلی است که فایل باید در آن کپی شود:

string source = "D:a.txt";
string destination = "G:AB.txt";
FileSystem.FileCopy(source, destination);

البته من درست متوجه منظور شما نشدم...:لبخندساده:

forodo
سه شنبه 24 دی 1392, 17:07 عصر
شما به وسیله ی تابع FileCopy میتونید یک فایل را در محلی خاص کپی کنید.
آرگومان اول محل فایلی است که باد کپی شود
آرگومان دوم محلی است که فایل باید در آن کپی شود:

string source = "D:a.txt";
string destination = "G:AB.txt";
FileSystem.FileCopy(source, destination);

البته من درست متوجه منظور شما نشدم...:لبخندساده:
این پست که واسه همین تاپیک هستش رو نگاه کنید. پست 6 (http://barnamenevis.org/showthread.php?435620-%DA%A9%D9%BE%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1-%D9%88-%D8%AA%D9%85%D8%A7%D9%85-%D9%85%D8%AD%D8%AA%D9%88%DB%8C%D8%A7%D8%AA-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A2%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D8%A7%DB%8C-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%28-API-%29&p=1949000&viewfull=1#post1949000)

shahryari
یک شنبه 29 دی 1392, 11:45 صبح
تبدیلش کن به سی شارپ
Sub CopyFolder(ByVal sour As String, ByVal dest As String)
Dim fso As System.Object = New System.Object
fso = CreateObject("scripting.filesystemobject")
fso.copyfolder(sour, dest)
End Sub

sagggad
یک شنبه 29 دی 1392, 11:50 صبح
این میشه فک کنم

void CopyFolder(string sour, string dest)
{
System.Object fso = new System.Object();
fso = CreateObject("scripting.filesystemobject");
fso.copyfolder(sour, dest);
}

sagggad
یک شنبه 29 دی 1392, 11:52 صبح
این کد کپی پوشه با آدرس sourceرادر آدرسdestباتمام محتویاتش کپی می کند.


using System.IO;


void Copy(string source, string dest)
{
DirectoryInfo diInfoSource = new DirectoryInfo(source);
DirectoryInfo diInfoDest = new DirectoryInfo(dest);
CopyInfo(diInfoSource,diInfoDest);
}
void CopyInfo(DirectoryInfo source,DirectoryInfo dest)
{
if (Directory.Exists(dest.FullName) == false)
Directory.CreateDirectory(dest.FullName);
foreach (FileInfo file in source.GetFiles())
{
file.CopyTo(Path.Combine(dest.ToString(),file.Name ),true);
}
foreach (DirectoryInfo dirSubSource in source.GetDirectories())
{
DirectoryInfo nextSubDest = dest.CreateSubdirectory(dirSubSource.Name);
CopyInfo(dirSubSource,nextSubDest);
}

}

منبع:http://barnamenevis.org/showthread.php?161849-%DA%A9%D9%BE%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1&p=730964&viewfull=1#post730964

shahryari
یک شنبه 29 دی 1392, 11:54 صبح
اینم تست کن
private void CopyFolder(string sour, string dest)
{
char c = (char) 34;
sour = c + sour + c ;
dest = c+ dest + c ;
System.Diagnostics.Process.Start("CMD.exe", "copy " + sour + " " + dest);
}

forodo
یک شنبه 29 دی 1392, 12:34 عصر
تبدیلش کن به سی شارپ
Sub CopyFolder(ByVal sour As String, ByVal dest As String)
Dim fso As System.Object = New System.Object
fso = CreateObject("scripting.filesystemobject")
fso.copyfolder(sour, dest)
End Sub

این میشه فک کنم

void CopyFolder(string sour, string dest)
{
System.Object fso = new System.Object();
fso = CreateObject("scripting.filesystemobject");
fso.copyfolder(sour, dest);
}
CreateObject رو ایراد می گیره.

forodo
یک شنبه 29 دی 1392, 12:36 عصر
این کد کپی پوشه با آدرس sourceرادر آدرسdestباتمام محتویاتش کپی می کند.


using System.IO;


void Copy(string source, string dest)
{
DirectoryInfo diInfoSource = new DirectoryInfo(source);
DirectoryInfo diInfoDest = new DirectoryInfo(dest);
CopyInfo(diInfoSource,diInfoDest);
}
void CopyInfo(DirectoryInfo source,DirectoryInfo dest)
{
if (Directory.Exists(dest.FullName) == false)
Directory.CreateDirectory(dest.FullName);
foreach (FileInfo file in source.GetFiles())
{
file.CopyTo(Path.Combine(dest.ToString(),file.Name ),true);
}
foreach (DirectoryInfo dirSubSource in source.GetDirectories())
{
DirectoryInfo nextSubDest = dest.CreateSubdirectory(dirSubSource.Name);
CopyInfo(dirSubSource,nextSubDest);
}

}

منبع:http://barnamenevis.org/showthread.php?161849-%DA%A9%D9%BE%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%84%D8%AF%D8%B1&p=730964&viewfull=1#post730964
ممنون از راهنماییتون.
ولی لطفاً پست 6 رو بخونید تا متوجه بشید که چرا من می خوام از توابع ویندوزی استفاده کنم.
این کد رو هم قبلاً تست کردم و اون دوتا مشکلم در پست 6 برطرف نشده.

forodo
یک شنبه 29 دی 1392, 12:37 عصر
اینم تست کن
private void CopyFolder(string sour, string dest)
{
char c = (char) 34;
sour = c + sour + c ;
dest = c+ dest + c ;
System.Diagnostics.Process.Start("CMD.exe", "copy " + sour + " " + dest);
}
هیچ اتفاقی نمی افته.
همینطوری محیط CMD بازه و من اونو نگاه می کنم و اون منو. :قهقهه: