[英]How to copy a file but touch the timestamp on the new copy?
我正在使用::CopyFile()
復制文件。 看來原始文件的時間戳正在保留,我希望副本在副本上設置當前時間戳,即“觸摸”它。
有WinAPI方式可以輕松做到這一點嗎?
如果您閱讀了有關CopyFile()
的MSDN文檔 ,則底部的注釋將顯示以下內容:
文件時間語義
本文應記錄有關文件創建/修改/訪問時間的語義。創建時間:如果目標文件已經存在,則保留其創建時間,否則將其設置為當前系統時間。
上次修改時間:始終從源文件的修改時間復制。
上次訪問時間:始終設置為當前系統時間。
和
修改時間並不總是保留
不能保證設置修改時間。 CopyFileEx確實嘗試設置修改時間,但是它沒有錯誤檢查。 這意味着如果在CopyFileEx內部設置修改時間失敗(例如,訪問被拒絕),后者將仍然返回成功!因此,如果修改時間對您的方案很重要(對於我的同步程序而言),則必須顯式調用SetFileTime()並檢查其返回值以確保。
您應該使用SetFileTime()
自己更新復制文件的時間戳,以確保將其設置為您想要將其設置為的時間戳。 MSDN上有一個示例:
#include <windows.h>
// SetFileToCurrentTime - sets last write time to current system time
// Return value - TRUE if successful, FALSE otherwise
// hFile - must be a valid file handle
BOOL SetFileToCurrentTime(HANDLE hFile)
{
FILETIME ft;
SYSTEMTIME st;
BOOL f;
GetSystemTime(&st); // Gets the current system time
SystemTimeToFileTime(&st, &ft); // Converts the current system time to file time format
f = SetFileTime(hFile, // Sets last-write time of the file
(LPFILETIME) NULL, // to the converted current system time
(LPFILETIME) NULL,
&ft);
return f;
}
:: CopyFile實際上是Windows的一部分:
http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa363851%28v=vs.85%29.aspx
這是一個方便功能,可以復制元數據。 還有另一種方法,盡管不太方便,但可以使用Windows復制文件。 查看以下功能:
讀取文件: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa365467%28v=vs.85%29.aspx
CreateFile: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa363858%28v=vs.85%29.aspx
WriteFile: http : //msdn.microsoft.com/zh-CN/library/windows/desktop/aa365747%28v=vs.85%29.aspx
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
BOOL WINAPI ReadFile(
_In_ HANDLE hFile,
_Out_ LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
BOOL WINAPI WriteFile(
_In_ HANDLE hFile,
_In_ LPCVOID lpBuffer,
_In_ DWORD nNumberOfBytesToWrite,
_Out_opt_ LPDWORD lpNumberOfBytesWritten,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
因此,您將使用以下內容打開文件:
CreateFile(<File>, GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
檢查無效的返回句柄,
使用以下內容創建新文件:
CreateFile(<File>, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)
檢查無效的返回句柄,
將文件讀入緩沖區:
ReadFile(handle for file 1, buffer, Buffer size, Destination file,OUT for Bytes Read, NULL)
然后寫出緩沖區:
WriteFile(outfile handle,buffer,number of bytes,NULL)
合上把手。
確保閱讀CreateFiles詳細信息,它也可以用於打開文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.