2016-05-08 12 views
3

私は、特定のフォルダの最大サイズを制限するOS XのC/C++で実装されているクォータマネージャを使っています。私のプロジェクトには、フォルダに新しいデータを書き込んだり、フォルダからサーバにデータを移動したりする一般的なスレッドワーカーがいます。閉じる後にファイルが削除されるのを待つ

このようにして、削除タスクによって、別のスレッドがディスクに書き込んでいる途中のファイルが削除されることがあります。

書き込みプロセス中にファイルが何らかの形で削除されるのを防ぐことができますか。私は自分の(フラグ、ロックなどを使って)自分のメカニズムを実装することができますが、私はそれがファイルシステムのプロパティでなければならないと信じています。

ファイルの削除に失敗したが、実際には成功したかどうかを確認するために、次のコードを試してみました。

#include <stdio.h> 
int main() { 
    FILE *fp; 
    fp=fopen("./x", "w"); 
    fprintf(fp, "Testing...\n"); 
    if(remove("./x") != 0) 
     perror("Error deleting file"); 
    else 
     puts("File successfully deleted"); 
    return 0; 
} 

削除する前にファイルを閉じることはできますか?

+0

あなたは[this](http://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-exists-in-c-cross-platform)に興味があるかもしれません。 。 – sjsam

+0

おそらくあなたは[このSO post](http://stackoverflow.com/questions/5769785/removing-a-file-in-c)と[man page](http://linux.die .net/man/3/remove)。 – user3078414

答えて

1

lsofコマンドを使用して、ファイルが開いているかどうかを確認します。 (lsofを - リスト開いているファイル

たとえば、あなたは-F pでlsofを呼び出すことができますし、それは出力 'P' で始まるプロセスのpidがします。

$ lsof -F p /some/file 
p1234 
p4567 

は参照してください:lsof man page

+0

こんにちは、それは良い方法です。しかし、私はプログラムでそれが必要です。おそらくC/C++ apiがファイルが開かれていることを確認するのを知っていますか? – Zohar81

+0

[man page](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/lsof.8.html)の**その他のプログラムの出力**セクションを読んでください。 。ヘッダー 'lsof_fields.h'が必要だと言います。 –

0

chattr(参照:https://en.wikipedia.org/wiki/Chattr)を使用すると、ファイルの削除を防止できます。 「不変」プロパティを読んでください。

+0

こんにちは、ありがとう、あなたの提案。しかし、ファイルを開くときにC/C++ apiを使って 'immutable'属性を設定する方法があるのだろうかと思います。さらに、不変の設定が設定者にも強制されているように見えます。ファイルに書き続け、削除を防ぐだけです。 – Zohar81

関連する問題