open()関数の結果で正の値に設定されたファイル記述子を持っています。私が実際のファイルを削除すると、fdはまだ正の整数です。私は何らかの理由でファイルを削除すると、このファイル記述子がもう有効ではないことを知ることができます。要するに、fdが示しているファイルが、そこに存在するかどうかを知ることができます。私はFreeBSDのCでこれをやろうとしています。ファイル記述子を使用してファイルがまだ存在するかどうかを確認する方法
答えて
UNIXシステムでは、開いているファイルを削除することができます(または、ファイルシステムからファイルへのすべての参照を削除することができます)。しかし、ファイル記述子はでも有効です。です。読み込みと書き込みの呼び出しは、そこにファイル名が残っているので、成功します。
つまり、ファイルディスクリプタが閉じられるまで、ファイルを完全に削除することはできません。クローズすると、ファイルは自動的に削除されます。
有効なファイル記述子を使用すると、ファイル名がまだ存在するかどうかを確認できます。 buf
はfstat
で初期化struct stat
ある
printf("%d\n", buf.st_nlink); // 0 means no filenames
。
アドバイスありがとうございますが、これは私が直面している別の状況です。 fdがまだそこにあるかどうかを確認する必要があります。 fdを介してそれを学ぶ方法は何ですか? –
@HasanBozok - 有効なファイル記述子で 'fstat'を使用すると、ハードリンクの数を取得できます。 0の場合、ファイル名は削除されています。 – teppic
@teppic、['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)を使ってファイルを実際に削除する方法はありますか?それが可能なら、それは危険でしょうか? –
ファイルに書き込む前に、それはまだそこaccess()
あなたはまた、ディスクリプタにfstat情報行うことができ
if (access("/yourfile",W_OK)!=-1) {
//Write on the file
}
使用している場合は、チェックすることができ:
struct stat statbuf;
fstat(fd,&statbuf);
if (statbuf.st_nlink > 0) {
//File still exists
}
をしかし、それはあなたのソフトウェアが遅くなりますいくつかのプログラムは、ファイルを別の場所にリンクして元の名前をリンク解除することができます。その結果、ファイルはまだ存在しますが、別の名前/場所の下にあります。
もっと良い選択肢は、GNU/Linux上でinotify
、またはbsd上でkqueueを使用することですが、私は2番目を使用したことはありません。
これらのAPIを使用して、ディレクトリの変更を監視したり、カーネルから通知を受け取ったり、ファイルが他のプロセスによって削除されたときにイベントを取得したりできます。
このイベントはリアルタイムではありませんので、イベントを取得する前に数ミリ秒間ファイルを使用することができます。
- 1. Prolog:述語が存在するかどうかを確認する方法は?
- 2. windowsstore appにファイルが存在するかどうかを確認する方法
- 3. ファイル+フォルダツリーが存在するかどうかを確認する方法
- 4. ワークシートがExcelファイルに存在するかどうかを確認する方法
- 5. 他のプロセスがファイル記述子を使用しているかどうかを判断する方法は?
- 6. PHP:ファイルが存在するかどうかを確認しますか?
- 7. 子が存在するかどうかを確認する
- 8. Mod_rewriteは、PHPファイルが存在するかどうかを確認します。
- 9. Javascriptを使用してファイルが存在するか確認する方法。JqueryとAjaxがありません。
- 10. ジキルを使用してファイルの存在を確認します
- 11. 電子メールアドレスを使用してPayPalアカウントが存在するかどうかを確認しますか?
- 12. SFINAE/templatesを使用して演算子が存在するかどうかを確認できますか?
- 13. XcodeでC++を開かずにファイルが存在するかどうかを確認してください。
- 14. ファイルが存在するかどうかを確認する方法はありますか?
- 15. ファイルが存在するかどうかを確認する方法はありますか?
- 16. ファイルがFTPサーバー上に存在するかどうかを確認する方法はありますか?
- 17. ノードがXMLファイルに存在するかどうかを確認する方法はありますか?
- 18. jQueryを使用してajax呼び出しが存在するかどうかを確認する方法?
- 19. 現在アクティビティインスタンスが存在するかどうかを確認する方法
- 20. SSISファイルがフォルダに存在するかどうかを確認するスクリプトタスク
- 21. 値が存在するかどうかをファイルに確認する
- 22. C/C++ - Mac OS X - ファイルが存在するかどうかを確認する
- 23. ファイルがエラーなく存在するかどうかを確認するには?
- 24. ファイルが他のフォルダに存在するかどうかを確認する
- 25. Matlabにファイルが存在するかどうかを確認するには?
- 26. ファイルがPythonに存在するかどうかを確認するには?
- 27. リモートコンピュータリストにファイルが存在するかどうかを確認するPowershellスクリプト
- 28. ファイルがゴミすぎずに存在するか確認してください。
- 29. ファイルがリモートサーバ上に存在し、パスに空白があるかどうかを確認してください
- 30. ノード - ディレクトリが存在するかどうかを確認してください
ファイルへの書き込みまたは読み取りを試みます。それはエラーを返します。 – RedX
@RedXこれはUNIXの仕組みではありません。 – LtWorf
はい、私はそのファイルを読んだり開いたりする必要があることを知っていますが、fdだけでファイルを開いたり読んだりする方法はありますか? fd、path、またはFILEだけで読み込みまたは開くためのio関数があります。* –