1

Windows で最近変更されたファイルのタイムスタンプを特定したいと考えています。

はい、st_atime、st_mtime、st_ctime で stat 関数を使用しました。ただし、Windows は特定のファイルのこれらのタイムスタンプを更新していません。(これは後でクライアント固有になるため、この動作を変更したくありません)。

では、最近変更されたファイルのタイムスタンプを特定するにはどうすればよいですか?

例えば

  • ファイル名の変更時のタイムスタンプ (これまでのところ機能していません)

  • ファイルを変更する際のタイムスタンプ (mctime がこれを提供しますが、一方向の解決策を優先します)

前もって感謝します。

4

2 に答える 2

1

Boost の を使用して多くの成功を収めましたfilesystem::last_write_time(path)が、Windows での経験から、短い期間にファイルに大量の書き込みを行っている場合、返されたタイムスタンプの解像度は、 '各書き込み後にタイムスタンプを要求しています

次のように使用できます。

boost::filesystem::path filePath = "Path/To/My/File.txt"
std::time_t writeTime = boost::filesystem::last_write_time(filePath);
std::ostringstream ss;
ss << std::put_time(&writeTime, "%c %Z");
std::string timeString = ss.str();

参考文献:

編集:

OS は名前が変更されたときにファイルのタイムスタンプを更新しないため、残念ながらイベントのリッスンを開始する必要があります。This SO postには、C++ からのものへのフックに関する良い情報があります。

C++ 側には がReadDirectoryChangesWあり、コールバックを として渡すことができます。LPOVERLAPPED_COMPLETION_ROUTINE多くの OS 固有のコードと同様に、すぐに理解するのはかなり難しくなります。

タイムスタンプが更新されるように名前の変更時にファイルに「触れる」ことに関しては、それ自体にコピーすることができます。見るCopyFile

マネージド C++ コードを書くことに反対でなければ、FileSystemWatercher's Renamed Eventがあります。

于 2017-02-03T13:06:38.147 に答える
1

Windows を使用している場合は、GetFileTime( httpsCreateFile : / /msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx )。

この目的のために、「最終書き込み時刻の取得」という記事を読むことを強くお勧めします: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724926(v=vs.85).aspx

コメントの後に編集します。

アプリのインクルード部分:

#include <string>
#include <sstream>
#include <iostream>

追加GetLastWriteTimeの代わりにリンクからのメソッドで:StringCchPrintf

// Build a string showing the date and time.
std::stringstream ss;
ss << stLocal.wYear << "-" << stLocal.wMonth << "-" << stLocal.wDay << " " << stLocal.wHour << ":" << stLocal.wMinute ;
std::string timeString = ss.str();
std::cout << timeString;

http://www.cprogramming.com/tutorial/c++-iostreams.htmlのドキュメントを読んでから、 http://en.cppreference.com/w/cpp/io/basic_stringstreamのリファレンスを読んでください。

于 2017-02-03T12:16:30.190 に答える