Change file LastWriteDate in Compact Framework

梦想的初衷 提交于 2019-11-28 10:13:55

问题


FileSystemInfo.LastWriteTime property is readonly in CF. Is there an alternative way to change that date?


回答1:


P/Invoke SetFileTime.

EDIT

Something along these lines (warning: untested)

[DllImport("coredll.dll")]
private static extern bool SetFileTime(string path,
                                      ref long creationTime,
                                      ref long lastAccessTime,
                                      ref long lastWriteTime);

public void SetFileTimes(string path, DateTime time)
{
    var ft = time.ToFileTime();
    SetFileTime(path, ref ft, ref ft, ref ft);
}



回答2:


Here is a fuller implementation, adapted from the answer ctacke provides above and this StackOverflow question. I hope this proves useful to someone:

// Some Windows constants
// File access (using CreateFileW)
public const uint GENERIC_READ          = 0x80000000;
public const uint GENERIC_WRITE         = 0x40000000;
public const uint GENERIC_READ_WRITE    = (GENERIC_READ + GENERIC_WRITE);
public const int INVALID_HANDLE_VALUE   = -1;

// File creation (using CreateFileW)
public const int CREATE_NEW             = 1;
public const int OPEN_EXISTING          = 3;

// File attributes (using CreateFileW)
public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;

// P/Invokes
[DllImport("coredll.dll", SetLastError = true)]
public static extern IntPtr CreateFileW(
    string lpFileName,
    uint dwDesiredAccess,
    uint dwShareMode,
    IntPtr pSecurityAttributes,
    uint dwCreationDisposition,
    uint dwFlagsAndAttributes,
    IntPtr hTemplatefile);

[DllImport("coredll.dll", SetLastError = true)]
public static extern int CloseHandle(IntPtr hObject);

// Note: Create related P/Invokes to change creation or last access time.
// This one modifies the last write time only.
[DllImport("coredll.dll", EntryPoint = "SetFileTime", SetLastError = true)]
private static extern bool SetFileWriteTime(
    IntPtr hFile,
    IntPtr lpCreationTimeUnused,
    IntPtr lpLastAccessTimeUnused,
    ref long lpLastWriteTime);

// Open a handle to the file you want changed
IntPtr hFile = CreateFileW(
    path, GENERIC_READ_WRITE, 0,
    IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
    IntPtr.Zero);

// Modify the last write time and close the file
long lTimeNow = DateTime.Now.ToFileTime();
SetFileWriteTime(hFile, IntPtr.Zero, IntPtr.Zero, ref lTimeNow);
CloseHandle(hFile);

Note that you can use System.IO.File.GetLastWriteTime (which is exposed in the .NET Compact Framework) to read the last write time if required.



来源:https://stackoverflow.com/questions/5673921/change-file-lastwritedate-in-compact-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!