2013-09-17 2 views
4

Я использую функцию для проверки временных меток на файлах на удаленных компьютерах. У нас много компьютеров.GetLastWriteTime неточно

То, что я использую, немного странно.

Я запускаю запрос на большом количестве компьютеров. Временная метка на Computer26887 появляется как «1/4/2013 12:46:01 AM» I UNC на этот компьютер и проверьте файл. В проводнике временная метка говорит «9/16/2013 11:23 утра» (полтора часа назад) Хммм .... Запрос снова - тот же старый, неправильный, метка времени. Я нажимаю правой кнопкой мыши на файле, перехожу к свойствам и нажимаю «Детали» в окне свойств - «Дата изменена 9/16/2013 11:23 утра» Запрос снова с кодом vb - теперь он показывает правильную метку времени? ??

У меня есть сотни систем, чтобы пройти, и если я не могу доверять данным, которые получаю, у меня слишком много работы!

Любые идеи?

Update
В основном, VB.NET является извлечение кэшированных версий метки времени. Временная метка обновлена, но кеш по-прежнему имеет старую метку времени. Как заставить кеш обновляться без ручного открытия свойств файла в проводнике?

Shared Function GetFileInfo(ByVal ComputerName As String, ByVal FiletoFind As String, info As String) 
    Dim Ret As String = "" 
    Dim targetfile = "\\" & ComputerName & "\" & FiletoFind 
    Dim fi As FileInfo = New FileInfo(targetfile) 
    If fi.Exists Then 
     fi.refresh 
     Select Case info 
      Case Is = "Exists" 
       Ret = fi.Exists.ToString 
      Case Is = "Delete" 
       fi.Delete() 
       Ret = fi.Exists.ToString 
      Case Is = "Created" 
       Ret = fi.CreationTime.ToString("MM/dd/yyyy hh:mm:ss tt") 
      Case Is = "Access" 
       Ret = fi.LastAccessTime.ToString("MM/dd/yyyy hh:mm:ss tt") 
      Case Is = "Mod" 
       Ret = fi.LastWriteTime.ToString("MM/dd/yyyy hh:mm:ss tt") 
     End Select 
    Else 
     Ret = "File Not Found" 
    End If 

    Ret = Ret.Replace(vbCrLf, "") 
    Ret = Ret.Replace(vbCr, "") 

    Return Ret 

End Function 

(я также попытался использовать File вместо FileInfo ... проверить историю пост)

UPDATE
Как испытание, я сделал проверку файлов в системе, используя код AutoIT3 , Он вернул точную информацию. После проверки AutoIT3 vb.net вернула точные временные метки. Итак, в чем проблема с vb.net, что AutoIT3 делает лучшую работу?

Func _timestampchk($path) 
Dim $file,$astamp 
$file = $path 
$astamp = FileGetTime($file, 0, 0) 
If IsArray($astamp) Then 
    $stamp = $astamp[1] & "/" & $astamp[2] & "/" & $astamp[0] & " " & $astamp[3] & ":" & $astamp[4] 
ElseIf $astamp = 0 Then 
    $stamp = "File " & $path & " not Found" 
Else 
    $stamp = 0 
EndIf 
Return $stamp 
EndFunc ;==>_timestampchk 
+0

Это звучит странно. Есть ли вероятность, что что-то происходит с разницей в часовом поясе? Кстати, как и предположение, вы можете захотеть использовать 'MessageBox.Show' вместо' MsgBox', 'Ret.Replace' вместо' Replace' и либо сделать 'info'' Enum', либо взломать метод в отдельный метод для каждого «случая». –

+1

Это довольно нормально, файловая система не обязана постоянно обновлять атрибут, пока процесс имеет открытый файл. В статье MSDN для этого есть громкое примечание. Единственная гарантия, которую вы имеете, - это то, что все процессы закрывают дескриптор файла. То, что вам будет трудно увидеть с удаленной машины. –

+0

@HansPassant - Это ДНИ, не имеющие точной метки времени с vb.net - точный в проводнике и т. д. Эти файлы не используются и не используются постоянно. Временная метка должна быть доступна не менее 30 минут. Это были дни на некоторых - и я могу «заставить» синхронизировать между проводником и тем, что смотрит vb .net, как описано выше. – BobbyKearan

ответ

0

Попробуйте FileSystem.GetFileInfo, как указывает Эндрю Мортон, и neoistheone

Dim information = My.Computer.FileSystem.GetFileInfo("C:\MyLogFile.log") 
information.Refresh() ' Calls must be made to Refresh before attempting to get the attribute information, or the information will be outdated. 
MsgBox("The file's full name is " & information.FullName & ".") 
MsgBox("Last access time is " & information.LastAccessTime & ".") 
MsgBox("The length is " & information.Length & ".") 

Хотя документально, и обоснование, это странное поведение. Как любопытство, я также попробовал бы этот код ниже, чтобы узнать, также ли проблема. Попробуйте использовать Windows API и посмотреть, вернет ли он данные кэширования.

Declare Function GetFileTime Lib "kernel32.dll" (ByVal hFile _ 
As Long, lpCreationTime As FILETIME, lpLastAccessTime _ 
As FILETIME, lpLastWriteTime As FILETIME) As Long 

Если don't решить, попытайтесь вызвать окно Open Properties программно, а затем прочитать информацию о времени, дате, и посмотреть, если это решает проблему:

'#VBIDEUtils#*********************************************** 
' * Programmer Name : Waty Thierry 
' * Web Site   : www.geocities.com/ResearchTriangle/6311/ 
' * E-Mail   : [email protected] 
' * Date    : 28/06/99 
' * Time    : 13:16 
' ******************************************************** 
' * Comments   : Showing the Properties dialog box 
' * 
' * This tip demonstrates how To use the Win32 API To 
' * bring up the explorer properties 
' * dialog box For a specified file. 
' * This API Function has the same effect As Right 
' * clicking On a file In Windows 95 And selecting properties. 

' ************************************************** 
Option Explicit On 

    Private Type SHELLEXECUTEINFO 
     cbSize As Long 
     fMask As Long 
     hwnd As Long 
     lpVerb As String 
     lpFile As String 
     lpParameters As String 
     lpDirectory As String 
     nShow As Long 
     hInstApp As Long 
     lpIDList As Long 
     lpClass As String 
     hkeyClass As Long 
     dwHotKey As Long 
     hIcon As Long 
     hProcess As Long 
    End Type 

Private Const SEE_MASK_INVOKEIDLIST = &HC 
Private Const SEE_MASK_NOCLOSEPROCESS = &H40 
Private Const SEE_MASK_FLAG_NO_UI = &H400 

Private Declare Function ShellExecuteEX Lib "shell32.dll" Alias _ 
    "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long 

Public Function ShowProps(FileName As String, _ 
    OwnerhWnd As Long) As Boolean 

    'USAGE: 
    'To show the properties dialog box of "c:\autoexec.bat", use the following code: 
    'Call ShowProps("c:\autoexec.bat", Me.hwnd) 
    'Function will return false if 
    'property windows can't be shown for 
    'any reason (e.g., invalid file or Ownerhwnd) 


    On Error Resume Next 
    Dim SEI As SHELLEXECUTEINFO 
    Dim r As Long 
    With SEI 
     .cbSize = Len(SEI) 
     .fMask = SEE_MASK_NOCLOSEPROCESS Or _ 
     SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI 
     .hwnd = OwnerhWnd 
     .lpVerb = "properties" 
     .lpFile = FileName 
     .lpParameters = vbNullChar 
     .lpDirectory = vbNullChar 
     .nShow = 0 
     .hInstApp = 0 
     .lpIDList = 0 
    End With 
    r = ShellExecuteEX(SEI) 
    ShowProps = r 
End Function 
Смежные вопросы