2013-04-09 49 views
4

我想寫一些東西到文件,就像如何更改一個文件,而不會影響「上次寫入時間」

using(var fs = File.OpenWrite(file)) 
{ 
    fs.Write(bytes, 0, bytes.Length); 
} 

但是,這改變了"last write time"。以後我可以重新設置,使用

File.SetLastWriteTime(file, <old last write time>); 

但與此同時,一個FileSystemWatcher已經觸發。

現在我的問題:可以在不改變「上次寫入時間」的情況下寫入文件嗎?

+3

你真的真的真的想要嗎?你實際上是在寫文件的,但是你可以暫停FileSystemWatcher(這已經不可靠了),所以你不必瞎寫假時間。 – JustAnotherUserYouMayKnow 2013-04-09 14:04:15

+0

我不這麼認爲!除非你更換底層驅動程序:P :)! – 2013-04-09 14:05:31

+0

@JustAnotherUserYouMayKnow:'FileSystemWatcher'不一定在我的控制之下:/ – tanascius 2013-04-09 14:20:44

回答

4

您可以通過在Kernel32.dll中使用P/Invoke調用來實現它。

This Powershell script來自MS TechNet的實現它,並明確指出FileSystemWatcher的事件不會觸發。

我簡要介紹了腳本,代碼非常簡單,可以很容易地複製到C#項目中。

聲明:

[DllImport("kernel32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SetFileTime(IntPtr hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime); 

腳本使用SetFileTime寫入之前,鎖定該文件的時間。

private const int64 fileTimeUnchanged = 0xFFFFFFFF; 

這個常數被傳遞作爲參考的lpCreationTime,lpLastAccessTime和lpLastWriteTime方法:

// assuming fileStreamHandle is an IntPtr with the handle of the opened filestream 
SetFileTime(fileStreamHandle, ref fileTimeUnchanged, ref fileTimeUnchanged, ref fileTimeUnchanged); 
// Write to the file and close the stream 
+0

感謝您的建議。這似乎是一個可能的解決方案,不幸的是,直到現在,我無法完成工作。只要我知道更多,我會提供一些反饋。 – tanascius 2013-04-11 09:59:54

2

不認爲這是可能的,也不是我所知道的。

同時認爲,「上次寫入時間」 Is Not Always Updated,這導致了一些有線的結果,如果你要根據這個參數從文件夾中找出(比如說)一些文件或依賴於以某種方式該屬性。所以它不是你開發時可以依賴的參數,它只是不適合OS的體系結構。

只需創建一個標誌:boolean,如果你寫的和觀看到相同的應用程序, 或flag,像一些特殊命名的文件,如果你寫一個形式,並從其他應用程序觀看。

+0

感謝您的回答。我無法使用標誌或文件,因爲具有FileSystemWatcher的應用程序不在我的控制之下。 – tanascius 2013-04-11 10:00:55

相關問題