2

2つのディレクトリ間でファイルをコピーするための基本的な同期プログラムを作成しようとしています。

計画では、すでにコピーされたファイルのある種のデータベースを用意して、プログラムがディレクトリをスキャンするときに、すでにコピーしたものと、再度コピーする必要があるもの、つまり変更されたファイルまたは新しいファイルを選択できるようにします。

アプローチ方法がわからない問題の1つは、ユーザーによって名前が変更されたファイルをどのように処理する必要があるかです。名前が変更されたファイルが、名前は異なりますが、実際にはデータベースにリストされているファイルと同じファイルであることをどのように確認できますか。プログラムが抽出できる基になるファイルIDはありますか?ファイルシステムが異なることを考えると、おそらくこれをより困難にするように、コードを移植可能にしたいと思います。

各ファイルのサイズと作成日をメモし、その情報をデータベースに保存して、ファイルの名前が実際に変更されたかどうかを判断できると考えていました。2つのファイルの情報サイズ/日付が同じである場合、ハッシュなどを保存して区別することはできますが、それがどれほど効率的かはわかりません。

助言がありますか?(私はC ++ / QTを使用しています)

4

2 に答える 2

2

アプリケーションの実行中に特定のフォルダ内のファイルへの変更を追跡するには、 を参照QFileSystemWatcherしてください。QFileSystemWatcher::addPath("directory/to/watch/")

ファイルが変更された、名前が変更された、またはディスクから削除されたときに、fileChanged()シグナルが発行されます。同様にdirectoryChanged()、ディレクトリまたはその内容が変更または削除されると、シグナルが発行されます。QFileSystemWatcherファイルの名前が変更されるかディスクから削除されるとファイルの監視を停止し、ディスクから削除されるとディレクトリの監視を停止することに注意してください。

名前が変更されたファイルを追跡し続けるには、もう一度使用してそれらの監視をQFileSystemWatcher::addPath()再度有効にします。


名前の変更操作中にアプリケーションが実行されていなかったときは、ファイルの内容を監視する必要があります (ファイルが削除されてコピーされた場合もカバーしたい場合は、Linux の inode / 他のファイルの何でもシステム タイプが変更されました)。

これは MD5 サムを使用して実行できますが、アプリケーションでファイル全体を読み取る必要があり、たとえば 10 メガバイトを超えるファイルでは速度が低下する可能性があります。この欠点が許容できる場合は、 によって返された MD5 サムを保存してください。もちろん、ハッシュの衝突が発生するまれなケースもありますが、ほとんどのアプリケーションではこれは問題になりません。ただし、コンテンツの変更を検出できない場合があることに注意してください。また、上記の単純なワンライナーはブロックしており、MD5 合計を計算する前にファイル全体をメモリに読み込むことにも注意してください。(代わりにandを使用して)によって提供される段階的な MD5 合計計算を使用して、ファイルを MD5 計算に「ストリーミング」します。QCryptographicHash::hash(file.readAll(), QCryptographicHash::Md5)QCryptographicHashaddData()result()

MD5 サムを作成する代わりに、コンテンツ全体を読み取る前にファイル サイズを比較すると、ほとんどの場合はうまくいきます (変更によって同じファイル サイズになることはめったにありません。そのような場合は、MD5 サムの比較に戻ることができます)。 . しかし、変更に気付いた後は、今後の変更を検出できるように、とにかく MD5 サムを読み取る必要があります!

于 2012-06-21T14:19:56.893 に答える
0

Unix では、 を使用してファイルのinode番号を取得できますstat

于 2012-06-21T14:27:34.807 に答える