मुझे हाल ही में File.Copy()
से CopyFileEx
का उपयोग करने से बदलना पड़ा है और मैं इसका उपयोग करने के तरीके के लिए संघर्ष कर रहा हूं।CopyFileEx wrapper पैरामीटर
बहुत सारे गुगलिंग के बाद मुझे this इसका उपयोग करने के लिए अच्छा रैपर मिला, लेकिन मुझे वर्तमान फ़ाइल की प्रतिलिपि बाइट्स की प्रगति प्राप्त करने की आवश्यकता है, और यदि संभव हो तो मैं उन सभी फ़ाइलों की प्रतिलिपि बनाने की प्रगति की गणना करता हूं जो मैं इसे पास करता हूं ।
(मुझे पता है कि ऐसी परियोजनाएं हैं जिनमें CopyFileEx
से प्रगति बार हैं, लेकिन मुझे प्रासंगिक कोड खींचने के लिए पर्याप्त अनुभव नहीं हुआ है, और मैं इस रैपर का उपयोग करना चाहता हूं)।
संभावित रूप से इसे कॉपी करने के लिए फ़ाइलों के कुल बाइट्स की तुलना करके, जो मैं पहले से पाता हूं, और उस से प्रतिशत का काम कर रहा हूं।
मेरे नकल की वर्तमान पद्धति
FileRoutines.CopyFile(new FileInfo("source.txt"), new FileInfo("dest.txt"));
मैं पर क्या अटक कर रहा हूँ कैसे पैरामीटर की प्रगति की जानकारी प्राप्त करने के लिए की जरूरत के साथ यह ओवरलोड है।
public sealed class FileRoutines
{
public static void CopyFile(FileInfo source, FileInfo destination)
{
CopyFile(source, destination, CopyFileOptions.None);
}
public static void CopyFile(FileInfo source, FileInfo destination,
CopyFileOptions options)
{
CopyFile(source, destination, options, null);
}
public static void CopyFile(FileInfo source, FileInfo destination,
CopyFileOptions options, CopyFileCallback callback)
{
CopyFile(source, destination, options, callback, null);
}
public static void CopyFile(FileInfo source, FileInfo destination,
CopyFileOptions options, CopyFileCallback callback, object state)
{
if (source == null) throw new ArgumentNullException("source");
if (destination == null)
throw new ArgumentNullException("destination");
if ((options & ~CopyFileOptions.All) != 0)
throw new ArgumentOutOfRangeException("options");
new FileIOPermission(
FileIOPermissionAccess.Read, source.FullName).Demand();
new FileIOPermission(
FileIOPermissionAccess.Write, destination.FullName).Demand();
CopyProgressRoutine cpr = callback == null ?
null : new CopyProgressRoutine(new CopyProgressData(
source, destination, callback, state).CallbackHandler);
bool cancel = false;
if (!CopyFileEx(source.FullName, destination.FullName, cpr,
IntPtr.Zero, ref cancel, (int)options))
{
throw new IOException(new Win32Exception().Message);
}
}
private class CopyProgressData
{
private FileInfo _source = null;
private FileInfo _destination = null;
private CopyFileCallback _callback = null;
private object _state = null;
public CopyProgressData(FileInfo source, FileInfo destination,
CopyFileCallback callback, object state)
{
_source = source;
_destination = destination;
_callback = callback;
_state = state;
}
public int CallbackHandler(
long totalFileSize, long totalBytesTransferred,
long streamSize, long streamBytesTransferred,
int streamNumber, int callbackReason,
IntPtr sourceFile, IntPtr destinationFile, IntPtr data)
{
return (int)_callback(_source, _destination, _state,
totalFileSize, totalBytesTransferred);
}
}
private delegate int CopyProgressRoutine(
long totalFileSize, long TotalBytesTransferred, long streamSize,
long streamBytesTransferred, int streamNumber, int callbackReason,
IntPtr sourceFile, IntPtr destinationFile, IntPtr data);
[SuppressUnmanagedCodeSecurity]
[DllImport("Kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern bool CopyFileEx(
string lpExistingFileName, string lpNewFileName,
CopyProgressRoutine lpProgressRoutine,
IntPtr lpData, ref bool pbCancel, int dwCopyFlags);
}
public delegate CopyFileCallbackAction CopyFileCallback(
FileInfo source, FileInfo destination, object state,
long totalFileSize, long totalBytesTransferred);
public enum CopyFileCallbackAction
{
Continue = 0,
Cancel = 1,
Stop = 2,
Quiet = 3
}
[Flags]
public enum CopyFileOptions
{
None = 0x0,
FailIfDestinationExists = 0x1,
Restartable = 0x2,
AllowDecryptedDestination = 0x8,
All = FailIfDestinationExists | Restartable | AllowDecryptedDestination
}
किसी भी पॉइंटर्स ने वास्तव में सराहना की।
यह कोड एक एमएसडीएन पत्रिका लेख के कोड के समान दिखता है। यदि ऐसा है, तो आपको मूल क्रेडिट करना चाहिए। http://msdn.microsoft.com/en-us/magazine/cc163851.aspx –
@ क्रिसडोलन - लिंक सिर्फ एमएसडीएन पत्रिका संग्रह को इंगित करता है - एमएसडीएन पत्रिका फरवरी 2005 के लिए सीएम देखें। नेट मैटर्स चित्रा 1 FileRoutines.CopyFile का उपयोग Win32 CopyFileEx –
@TheLonelyCoder - हम्म, आप सही हैं। मैंने इसे यहां पुनः पाया: https://web.archive.org/web/20130304214632/http://msdn.microsoft.com/en-us/magazine/cc163851.aspx लेकिन सीएसएस के बिना, इसलिए यह बहुत कठिन है –