C# 如果文件在.NET中较新,则覆盖该文件
我的应用程序在启动时检查共享网络驱动器上是否有更新版本的文件。如果网络共享上的目录较新,它会将其复制到本地应用程序目录并覆盖旧目录。我目前的代码是这样的:C# 如果文件在.NET中较新,则覆盖该文件,c#,.net,copy,last-modified,C#,.net,Copy,Last Modified,我的应用程序在启动时检查共享网络驱动器上是否有更新版本的文件。如果网络共享上的目录较新,它会将其复制到本地应用程序目录并覆盖旧目录。我目前的代码是这样的: FileInfo sourceFile = new FileInfo(source + "\\" + fileName); if(sourceFile.Exists) { FileInfo destFile = new FileInfo(destination + "\\" + fileName); if (destFile.
FileInfo sourceFile = new FileInfo(source + "\\" + fileName);
if(sourceFile.Exists) {
FileInfo destFile = new FileInfo(destination + "\\" + fileName);
if (destFile.Exists && destFile.LastWriteTime >= sourceFile.LastWriteTime)
{
//Using log4net
log.Info("Current " + fileName + " is newer than the one on the server.");
return false;
}
}
检查日志时,似乎有时源文件的LastWriteTime
未被检测为较新(更新时发生事件)。我是否可能会对写入时间和修改时间感到困惑?有人知道如何做到这一点吗
编辑(并复制以下我的评论):
我复制的文件大部分是我可以控制的DLL文件。它们是应用程序“Growl for Windows”的程序集;它们定义自定义显示。我的应用程序的目的是检查网络共享以查看是否有更新的版本可用,并在需要时在本地复制该版本。这样,我们可以帮助确保所有客户使用最新的显示器
编辑2:
好吧,我在加载程序集时胡闹了一下,然后遇到了另一个问题。当通过程序集加载同一文件时,您似乎无法两次加载同一文件,即使它们来自不同的位置。请注意,返回的值可能不准确。请注意关于Refresh
方法的注释-虽然上面的代码几乎肯定不需要调用该方法,但如果您正在创建FileInfo对象并将其保留任意时间,这可能适用
Windows有权延迟更新文件的实际上次写入时间-关于延迟的时间,请检查处理文件信息的Windows API调用。根据:
此方法可能返回不准确的
值,因为它使用本机
其值可能不正确的函数
由运营商持续更新
系统
如果可能,我会尝试以下方法之一:
- 在文件名中嵌入日期
- 在文件中存储文件版本或日期
内容
这样,您就不必担心涉及LastWriteTime
属性的问题。不幸的是,这不是一个选项,因为我主要是复制DLL。也许有什么方法可以加载有关DLL构建时间的信息?@Duracell-如果是关于DLL的,那么它是否更新,或者是否与您当前拥有的DLL不同,这有关系吗?依定义,网络共享上的DLL(如果有)不是您想要运行的文件吗?很明显,我假设您的进程在本地没有构建相同的DLL。它们是程序集吗?你能控制他们吗?如果是这样,那么AssemblyName.Version属性可能会对您有所帮助。否则,您可以将有关文件的元数据存储在文件本身之外(其他文件或包含文件的文件夹中)。你有更多的上下文信息可以帮助你吗?我一直在研究这个问题,可能会是我的选择。我可以控制这些DLL。它们是应用程序“Growl for Windows”的程序集;它们定义自定义显示。我的应用程序的目的是检查网络共享以查看是否有更新的版本可用,并在需要时在本地复制该版本。这样,我们可以帮助确保所有客户使用最新的显示器。