2010-07-22 2 views
1

Мое приложение проверяет запуск, если на общем сетевом диске имеется более новая версия файла. Если общий ресурс сети более новый, он копирует его в локальный каталог приложения и перезаписывает старый. Мой текущий код, чтобы сделать это звучит примерно так:Перезаписать файл, если новый в .NET

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 исходного файла не обнаруживается, так как новые (случае, если она есть). Возможно ли, что время написания и измененные времена смущены? Кто-нибудь знает, как этого достичь?

EDIT (и копия моего комментария ниже): Файлы, которые я копирую, - это в основном файлы DLL, которыми я управляю. Это сборки для приложения «Growl for Windows»; они определяют пользовательские дисплеи. Цель моего приложения - проверить общий сетевой ресурс, чтобы узнать, существует ли более новая версия и скопировать ее локально, если это необходимо. Таким образом, мы можем помочь обеспечить, чтобы все наши клиенты использовали самый современный дисплей.

EDIT 2:

ОК, я дурачился с загрузкой сборки, и я столкнулся с другой проблемой. Кажется, вы не можете загрузить один и тот же файл дважды, даже если они из разных мест, когда они загружаются через Assembly.ReflectionOnlyLoadFrom.

ответ

1

docs for LastWriteTime Обратите внимание, что возвращаемое значение может быть неточным. Обратите внимание также на комментарий о методе Refresh - в то время как вышеприведенный код почти наверняка не потребует, чтобы это было вызвано, если вы создаете объекты FileInfo и удерживаете их на протяжении какого-то времени, это может быть применимо.

Windows может освободить время для обновления фактического последнего времени записи файла - как долго это может задерживаться, проверьте на вызовы Windows API, касающиеся информации о файле.

1

По MSDN:

Этот метод может возвращать неточное значение, поскольку она использует собственные функции, значения которых не могут быть постоянно обновляется операционной системы.

Если возможно, я хотел бы попробовать одно из следующих действий:

  • Вставка даты в имени файла
  • магазина версии файла или даты в файле содержимого.

Таким образом, вам не придется беспокоиться о проблемах, связанных с имуществом LastWriteTime.

+0

К сожалению, это не вариант, потому что я в основном копирую DLL. Возможно, есть какой-то способ загрузить информацию о времени сборки DLL? – Anthony

+0

@Duracell - Если речь идет о DLL, имеет ли значение, новее или просто отличается ли она от той, что у вас есть? IOW, будет ли DLL на сетевом ресурсе (если таковой имеется) не файл, который вы хотите запустить по определению? Очевидно, я предполагаю что-то о вашем процессе, - что вы не строите одну и ту же DLL локально. – arootbeer

+0

Являются ли они сборками? У вас есть контроль над ними? Если это так, возможно, свойство AssemblyName.Version будет вам полезно.В противном случае вы можете хранить метаданные о файлах вне самих файлов (в других файлах или в папке с содержимым). У вас есть более контекстная информация, которую мы можем вам помочь? –