Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
To create a page in a module other than kernel32, prefix the name with the module name and a period.
Private Declare Auto Function CopyFileEx Lib "kernel32.dll" (ByVal lpExistingFileName As String, _
ByVal lpNewFileName As String, ByVal lpProgressRoutine As CopyProgressRoutine, _
ByVal lpData As IntPtr, ByRef pbCancel As Boolean, _
ByVal dwCopyFlags As CopyFileFlags) As <MarshalAs(UnmanagedType.Bool)> Boolean
VB.NET Signature:
<DllImport("kernel32.dll", CharSet := CharSet.Unicode, CallingConvention := CallingConvention.StdCall, SetLastError := True)>
Shared Function CopyFile(<MarshalAs(UnmanagedType.LPWStr)> ByVal lpExistingFileName As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpNewFileName As String, <MarshalAs(UnmanagedType.Bool)> ByVal bFailIfExists As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
delegate CopyProgressResult CopyProgressRoutine(
long TotalFileSize,
long TotalBytesTransferred,
long StreamSize,
long StreamBytesTransferred,
uint dwStreamNumber,
CopyProgressCallbackReason dwCallbackReason,
IntPtr hSourceFile,
IntPtr hDestinationFile,
IntPtr lpData);
using System;
using System.Runtime.InteropServices;
bFailIfExists - Whether or not CopyFile will overwrite lpNewFileName if the file exists.
If true, CopyFile will return false if lpNewFileName is an existing file. */
static void Main(string[] args)
{
enum CopyProgressCallbackReason : uint
{
CALLBACK_CHUNK_FINISHED = 0x00000000,
CALLBACK_STREAM_SWITCH = 0x00000001
}
string SourceFile = "C:\\MySourceFile.txt"; // This file must exist or else CopyFile will fail and return false.
string DestinationFile = "C:\\MyDestinatioFile.txt";
if (CopyFile(SourceFile, DestinationFile, true))
{
// Your code here if CopyFile succeeds
Console.WriteLine("File successfully copied.");
} else
{
// Your code here if CopyFile fails
Console.WriteLine("File could not be copied. The file already exists.");
}
private CopyProgressResult CopyProgressHandler(long total, long transferred, long streamSize, long StreamByteTrans, uint dwStreamNumber,CopyProgressCallbackReason reason, IntPtr hSourceFile, IntPtr hDestinationFile, IntPtr lpData)
{
return CopyProgressResult.PROGRESS_CONTINUE;
}
Sample VB.NET Code:
' Multithreaded managed wrapper.
Public Class CopyFile_Ex
Private Declare Auto Function CopyFileEx Lib "kernel32.dll" (ByVal lpExistingFileName As String, _
ByVal lpNewFileName As String, ByVal lpProgressRoutine As CopyProgressRoutine, _
ByVal lpData As IntPtr, ByRef pbCancel As Boolean, _
ByVal dwCopyFlags As CopyFileFlags) As <MarshalAs(UnmanagedType.Bool)> Boolean
Private Delegate Function CopyProgressRoutine(ByVal TotalFileSize As Long, _
ByVal TotalBytesTransferred As Long, ByVal StreamSize As Long, ByVal StreamBytesTransferred As Long, _
ByVal dwStreamNumber As UInteger, ByVal dwCallbackReason As CopyProgressCallbackReason, _
ByVal hSourceFile As IntPtr, ByVal hDestinationFile As IntPtr, ByVal lpData As IntPtr) As CopyProgressResult
Private CopyExSyncObject As New Object
Private pbCancel As Boolean = False
Private sourcePath As String
Private destPath As String
Private overWrite As Boolean
Private complete As Boolean
Private totalBytes As Int64
Private ammountTransfered As Double
Private Enum CopyProgressResult As UInteger
PROGRESS_CONTINUE = 0
PROGRESS_CANCEL = 1
PROGRESS_STOP = 2
PROGRESS_QUIET = 3
End Enum
Private Enum CopyProgressCallbackReason As UInteger
CALLBACK_CHUNK_FINISHED = &H0
CALLBACK_STREAM_SWITCH = &H1
End Enum
Private Function GetFilenameFromPath(ByVal filePath As String, _
Optional ByVal errMsg As String = "") As String
If filePath.Contains("\") Then
Dim parts() As String
parts = Split(filePath, "\")
Return parts(parts.Length - 1)
Else
Return ""
End If
End Function
Public Sub New(ByVal _sourcePath As String, ByVal _destPath As String, ByVal _overWrite As Boolean)
complete = True
CopyEx(_sourcePath, _destPath, _overWrite)
End Sub
Public Sub New()
complete = True
End Sub
Public Function GetBytesTransfered() As Int64
SyncLock CopyExSyncObject
GetBytesTransfered = CLng(ammountTransfered)
End SyncLock
End Function
Public Function GetPercentComplete() As Integer
SyncLock CopyExSyncObject
GetPercentComplete = CInt((ammountTransfered / totalBytes) * 100)
End SyncLock
End Function
Public Sub Cancel()
SyncLock CopyExSyncObject
pbCancel = True
End SyncLock
End Sub
Public Function IsComplete() As Boolean
SyncLock CopyExSyncObject
IsComplete = complete
End SyncLock
End Function
Public Sub CopyEx(ByVal _sourcePath As String, ByVal _destPath As String, ByVal _overWrite As Boolean)
Dim _theFilesInfo As New FileInfo(sourcePath)
totalBytes = _theFilesInfo.Length
Dim copyThread As New Threading.Thread(AddressOf StartCopy)
copyThread.Start()
End Sub
Private Sub StartCopy()
If overWrite Then
CopyFileEx(sourcePath, destPath, New CopyProgressRoutine(AddressOf CopyProgressHandler), IntPtr.Zero, pbCancel, CopyFileFlags.COPY_FILE_OPEN_SOURCE_FOR_WRITE)
Else
CopyFileEx(sourcePath, destPath, New CopyProgressRoutine(AddressOf CopyProgressHandler), IntPtr.Zero, pbCancel, CopyFileFlags.COPY_FILE_FAIL_IF_EXISTS)
End If
complete = True
End Sub
Private Function CopyProgressHandler(ByVal total As Long, ByVal transferred As Long, ByVal streamSize As Long, ByVal StreamByteTrans As Long, ByVal dwStreamNumber As UInteger, ByVal reason As CopyProgressCallbackReason, _
ByVal hSourceFile As IntPtr, ByVal hDestinationFile As IntPtr, ByVal lpData As IntPtr) As CopyProgressResult
SyncLock CopyExSyncObject
ammountTransfered = transferred
End SyncLock
If pbCancel Then
complete = True
ammountTransfered = 0
pbCancel = False
Return CopyProgressResult.PROGRESS_CANCEL
Else
Return CopyProgressResult.PROGRESS_CONTINUE
End If
End Function
End Class
Alternative Managed API:
File.Copy performs copying without a callback or options.
Copies an existing file to a new file, notifying the application of its progress through a callback function.
5/31/2012 10:16:20 PM - -203.158.51.233
Delegate called back by CopyFileEx and MoveFileWithProgress.
helpful tips or sample code to share for using this API in managed code?
corrections to the existing content?
variations of the signature you want to share?
additional languages you want to include?
Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).