簡體   English   中英

如何復制文件,但觸摸新副本上的時間戳?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM