2015-05-28 3 views
0

Как часть макроса автоматического обновления, у меня есть экземпляр Access FrontEnd на локальном диске, который при открытии проверяет, имеет ли файл на сервере новую функцию CreateDate. Если он новее, мой код в настоящее время использует fileSystemObject для CopyFile и перезаписывает версию локального диска (имя файла остается тем же).DateCreated glitch? Как идентифицировать, если переписывание

Проблема, с которой я столкнулась, заключается в том, что когда это делается, «дата создана» не изменяется в отношении нового файла и поэтому постоянно циклически меняется, когда старый файл закрыт, а новый открыт - который проверяет обновления, основанные на созданной дате ... Я даже пытался использовать kill в локальном файле и ждать 10 секунд перед выполнением команды Copyfile, но даже тогда он появляется с датой создания удаленного файла.

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

Кто-нибудь сталкивался с этим раньше и нашел решение? Я пропустил что-то очевидное, что бы «обновить» созданную дату файла?

EDIT Я думаю, что это очень близко к тому, что у меня было.

Dim strSource As String, strDest As String, strOrigDB As String, strSvrDB As String 
Dim varOldDB As Variant, varNewDB As Variant, fso As Object 

Set fso = CreateObject("scripting.filesystemobject") 

strSource = "\\192.168.1.2\Data\svrDatabase" 
strSvrDB = "AnyOldName.mde" 
strDest = "C:\myFolder\myDatabase" 
strOrigDB = "KeepMyName.mde" 

varOldDB = (strDest & "\" & strOrigDB) 
varNewDB = (strSource & "\" & strSvrDB) 
If fso.getfile(varOldDB).DateCreated < fso.getfile(varNewDB).DateCreated Then 
    Kill strDest & "\" & strOrigDB 
    Excel.Application.Wait Now() + TimeValue("00:00:05") 
    fso.copyfile (strSource & "\" & strSvrDB), (strDest & "\" & strOrigDB), True 
    'open new database version 
    ShellExecute 0, "Open", (strDest & "\" & strOrigDB), "", "", 1 
    DoCmd.Quit 
End If 

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

EDIT Подумав об этом, и надеясь, что моя логика не полностью разрушена, было бы лучше, если бы я был ярлык для пользователя щелкнуть, но вместо того, чтобы открыть Frontend, он открывает файл сценария, который проверяет наличие обновления. Если есть обновление, он удаляет локальный Frontend и копирует серверный (который должен быть назван по-разному оригиналу) в локальную папку - затем открывается новый интерфейс.

Это будет означать, что проверенная дата будет всегда обновляться при копировании в локальную папку, а kill будет работать, потому что файл не был открыт. Я все еще немного опасаюсь использовать lastdatemodified incase, когда пользователь открывает базу данных при создании обновления - Frontend содержит таблицы, используемые в поисках, которые, как я полагаю, изменят модифицированную дату Frontend. В этом случае изменение локальной даты будет по-прежнему больше, чем новый интерфейс на сервере.

+1

Трудно делать какие-либо предложения, не видя существующего кода. –

+1

Я согласен с Тимом Уильямсом. Кроме того, вы уверены, что ваша копия преуспевает? Похоже, это может быть просто неудачно. А код, который выполняет копирование, находится не в базе данных? – ChipsLetten

+0

Извините, дома прямо сейчас, и код находится на моем рабочем компьютере. Я посмотрю, смогу ли я его запомнить и опубликовать. Копия, безусловно, преуспевает - я даже шагнул через код с открытой папкой. Файл удаляется, приостанавливается, copyfile помещает новый файл, но дата создаётся из удаленного файла, а не из нового. Код, выполняющий копирование, является частью Autoexec для интерфейса - первое, что запускается, как только открывается интерфейс. Бэкэнд находится в облаке, поэтому не открывается соединение с этим макросом. Пойду, чтобы получить некоторый код, чтобы выставить сейчас - я думал, что это будет известная проблема. – Glib

ответ

1

Вы должны использовать Date Modified. Вот когда последний файл был изменен.

Это то, что помогает говорить о времени.

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

Так что попробуйте закрыть все файлы перед тем, как сравнивать времена.

Также От https://support.microsoft.com/en-us/kb/172190

Когда имя удаляются из каталога (переименовать или удалить), его короткую/длинную пару имени и времени создания сохраняется в кэше, введенный по имени, которое было удалено. Когда имя добавляется в каталог (переименовывать или создавать), выполняется поиск кеша, чтобы узнать, есть ли информация для восстановления. Кэш эффективен для экземпляра каталога. Если каталог удален, кеш для него удаляется.

Кроме того, переживание из ненадежного источника изменит последнее изменение точно.

Также существуют правила копирования и перемещения.

Также файлы должны быть целыми в системе Windows eco для правильного применения правил Windows.

+0

Я полагаю, что я не должен запускать код чтобы убить файл, находясь в файле. ChipsLetten просто указал на это. Эта секция кэша, которую вы выложили, не слишком волнует меня :) Похоже, что это может быть немного сложно обойти. Большое спасибо за ответ. – Glib