2011-03-15 51 views
0

使用类似这样的东西是否安全以确保目录当前未被写入?DirectoryInfo.LastWriteTime是一种安全的方式来检查文件是否仍在上传?

Dim ImportDir As New DirectoryInfo("C:\MyPath\") 
If DateDiff(DateInterval.Minute, ImportDir.LastWriteTime, Now) < 10 Then 
    Exit Sub 
End If 

我处理可高达为10MB,所以我主要的问题是我不知道的LastWriteTime属性是否(这大概引用文件系统“最后修改”元数据)的图像被更新时,首先,将文件的最后或每个字节写入磁盘。

文件通常会通过IIS7 FTP上载到Windows 2008服务器上的NTFS文件系统。如果它依赖于文件系统,尽管知道哪些文件系统会更新。

编辑:我希望这可以用来简化程序,确保整个目录一次处理。最后,我决定重新考虑一下,因为变通办法比我试图避免的变得更加混乱和不可靠!欢呼的答案虽然

+0

时间检查通常是一个糟糕的主意:想象慢速连接(或一些重要的路由器问题w /丢失数据包)和一些缓冲。最后修改可能不会相应更新。最简单的方法是尝试打开文件进行写入,否则将意味着文件仍处于锁定状态。 – bestsss 2011-03-15 13:31:30

回答

2

完全没有。 LastWriteTime在写入后更新,而不是写入时。你需要依靠上传的任何程序来锁定文件。任何体面的人都会。因此,试图用FileShare.Read或FileShare.None的FileStream构造函数打开文件将引发IOException。这几乎总是有效的。

+0

感谢您的确认。我想我必须依次尝试锁定每个文件 – Phil 2011-03-15 14:30:01

2

我不完全确定你的方法会有多精确。但是,另一种解决方案是尝试在try-catch中以独占模式(FileShare.None)打开文件,例如,

Dim fs As FileStream = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.None); 

(显然把它放在一个try-catch内)

虽然这被普遍认为是例外编码,它提供了一个替代方案确保该文件没有被其他进程锁定。

+0

无论提供构造名称(由异常编码)的专家的名字可能是,它实际上是一个例外,试图打开一个锁定的文件。依靠这个例外在我的书中完美无缺(只是放弃了关于意图的单行注释) – bestsss 2011-03-15 13:40:10

+0

感谢您的答案,但我需要知道目录中的任何**文件是否正在使用,并获取锁定一个目录是不可能的 – Phil 2011-03-15 14:30:27

+0

@Phil你可以枚举目录中的文件吗? – 2011-03-15 14:44:38

相关问题