2016-07-21 11 views
3

私はPythonで1つ、PowerShellで1つ、ファイルの最終変更を取得して比較する2つのスクリプトを用意しています。 PowerShellでは1が使用しています:WindowsでのPythonの最後の変更時間の取得

$t = $f.LastWriteTime.ToFileTimeUtc() 

この時間は、私にとっての主であり、私はPythonで同じ情報を取得する必要があります。私はos.statを使用して、この式を使用した「Windowsファイルの時間」にUNIXタイムスタンプ*を変換しています:

statinfo = os.stat(file_name) 
t = long(statinfo.st_mtime * 10000000L) + 11644473600L * 10000000L 

はしかし、私は、丸め誤差の問題に実行します。 st_mtimeは浮動小数点であり、それを乗算して長時間キャストすると精度が失われます。通常、誤差は10未満です(1ミリ秒未満です)。もちろん、プログラムを修正してこの精度内の数値を比較することはできますが、同じ数字を持つ方が大丈夫です。

ので、ここでの同様の質問があります:How do I get *change* file time in Windows?そこから私はしかし、私はIronPythonの、PyWinまたは類似のPython拡張モジュールを使用せずにそれを行う方法がわからないです、私は構造FILE_BASIC_INFORMATION(http://msdn.microsoft.com/en-us/library/windows/hardware/ff545762(v=vs.85).aspx)にアクセスしなければならない集まります。この情報へのアクセスには簡単な方法がありますか(おそらく​​を使用しています)?

* Windowsファイルの時刻は、1601年1月1日午後12時00分(米国時間)から経過した100ナノ秒の間隔の数を表す64ビットの値です。世界協定世界時(UTC)。 https://msdn.microsoft.com/en-us/library/system.datetime.tofiletimeutc(v=vs.110).aspx

答えて

0

を参照してください。この問題を抱えている人のために。実際には、私が言及した質問は、How do I get *change* file time in Windows?は、あまりにも誤解を招いていることが判明しました。それは、あいまいな運転者アクセスのみの機能ZwQueryInformationFileを言及していますが、普通のGetFileTime機能が使用できます。どちらの方法でも、これらの関数はファイルハンドルを必要とし、順番にCreateFileCloseHandleを呼び出す必要があります。ファイル数が多い場合(私の場合は約100万)、これはかなり高価です。だから、私はGetFileAttributesExWを使用しただけでパスが必要です。私の測定では、これは​​を使って関数を呼び出すオーバーヘッドになると思うが、これはまだ少し遅い(約10%)os.statだと思う。

インターネットからコピー貼り付けをした後、私が望んだとおりに次のコードをまとめました。

from ctypes import windll, Structure, byref 
from ctypes.wintypes import LPWSTR, DWORD, FILETIME 

class WIN32_FILE_ATTRIBUTE_DATA(Structure): 
    _fields_ = [("dwFileAttributes", DWORD), 
       ("ftCreationTime", FILETIME), 
       ("ftLastAccessTime", FILETIME), 
       ("ftLastWriteTime", FILETIME), 
       ("nFileSizeHigh", DWORD), 
       ("nFileSizeLow", DWORD)] 

filename = 'path and file name' 

wfad = WIN32_FILE_ATTRIBUTE_DATA() 
GetFileExInfoStandard = 0 
windll.kernel32.GetFileAttributesExW(LPWSTR(filename), GetFileExInfoStandard, byref(wfad)) 
lowtime = long(wfad.ftLastWriteTime.dwLowDateTime) 
hightime = long(wfad.ftLastWriteTime.dwHighDateTime) 
filetime = (hightime << 32) + lowtime 
print filetime 
関連する問題