8

私はPerlベースのファイル同期ツールに取り組んでいます。ファイルを一時ディレクトリ(実際のファイルと同じファイルシステム上にあることが保証されています)にダウンロードしてから、一時ファイルを古いファイルの上に移動し、アクセス許可、所有権、ACLなどのメタデータを保持します。Linuxでその最後のステップをどのように達成するのか疑問に思っています。

Mac OS Xでは、少なくともCでは、このexchangedata関数を使用します。これは、引数として2つのファイル名を取り、それらの内容を交換して、すべてのメタデータ(mtimeを除く)をそのまま残します。これにより、操作がアトミックであることが保証されます。すべてのリーダーには、古いファイルまたは新しいファイルのいずれかが表示され、その間に何かが表示されることはありません。残念ながら、Linuxでは利用できないと思います。

アトミックに移動することは知っていrenameますが、メタデータは保持されません。一方、ファイルを開いてデータを新しいコンテンツで上書きすることもできます。これにより、すべてのメタデータが保持されますが、不可分操作にはなりません。この問題に取り組むための提案はありますか?

4

2 に答える 2

6

ここで確認できる唯一の方法は、置き換えるファイルからメタデータを読み取り、それを一時ファイルに適用してから、一時ファイルの名前を古いファイルに変更することです。(rename明らかに、ソースファイルの属性を保持します。)

于 2009-11-07T18:14:48.373 に答える
4

ファイルシステム固有ですが...

XFS_IOC_SWAPEXTioctl は、XFS 上の 2 つのファイル記述子のエクステントを交換します

#include <xfs/xfs.h>
#include <xfs/xfs_dfrag.h>

xfs_swapext_t sx = {
    ...,
    .sx_fdtarget = fd1,
    .sx_fdtmp    = fd2,
    ...
};
xfs_swapext(fd1, &sx);

使用例については、 xfs_fsrのソースを参照してください。

于 2009-11-07T20:47:16.693 に答える