2016-08-15 20 views
3

開けたときに削除できるファイルをifstreamで作成したいと思います。ifstreamでファイルを開くときにファイルdetele特権を共有する方法

私は、Windows APIを使用している場合、それは簡単です知っている:CreateFile

CreateFile(...,FILE_SHARE_DELETE,...) 

しかし、ときに私ははifstreamでファイルを開いてテストします。

私はそれを開くと削除できません。

ifstreamFILE_SHARE_DELETEなどの設定属性に関するドキュメントが見つかりませんでした。

この問題を解決するにはどうすればよいですか?

+5

携帯型ではできません。 –

+0

私が必要としたら、 'ifstream'を既存のC' FILE'ハンドルまたはファイル番号でオープンする方法を見ていきます。これはAPIレベルハンドルに対応します。たぶん –

+2

いくつかのコンパイラ(例えば 'GCC')はすぐに標準の*ファイルシステム*ライブラリを' Technical Specification'として提供します。 [std :: experimental :: filesystem :: remove](http://en.cppreference.com/w/cpp/experimental/fs/remove)を使用することができます。さもなければ 'boost 'に同じ(または類似の)ライブラリがあります。 – Galik

答えて

2

ファイルのパーミッションは、オペレーティングシステムによって異なります

全体-ファイルアクセス共有の読み取りのために、書き込み、または

  • を削除* nixのシステムは読み取り、書き込み、および実行の許可を提供しますが、as far as delete permissions 、必要とされているすべてのことは、次のとおりです。

書き込みは+親ディレクトリのアクセス許可を実行します。ファイル自体のパーミッションは

無関係でWindowsが本当に削除アクセス権を持つ唯一のシステムであり、そしてそれはすでにCreateFile with FILE_SHARE_DELETEの形でそれ自身のアクセサを提供しているので、実際にこの機能を標準化する動機がありません。

この機能を使用すると、(ファイルサイズによっては、これは非常に高価になる可能性があることに注意してください)このクロスプラットフォームの機能を実装することができ、あなたのプログラムに極めて重要である場合:

  1. 読み取りのためのオープンファイルをしてfstreamと書きます。これは何かを失敗したファイルのロックを持っているとあれば、削除
  2. Slurp the file
  3. closeファイル
  4. removeファイルのためにそれを開くことはできないだろう。これが失敗した場合に返さofstreamが開いているとして、あなたは
  5. は限りofstream
  6. 戻りofstream

ofstream

  • "Unslurp" the fileを書き込むためのファイルを再度開き、ファイルに削除権限がありませんオペレーティングシステムは、ファイルに対するアクセス許可の変更を防止するか、ディレクトリを含むかどうかを管理します。したがって、既にファイルを削除しているという事実のおかげで、ofstreamを閉じてもファイルを削除することができます。 std::ifstream

  • 2

    のVisual Studioのバージョンでは、両方が(利用可能なフラグのリストについて_fsopen()を参照してください)「ファイル保護/共有フラグ」を指定するための追加のオプション_Protのパラメータを持っていることを非標準のコンストラクタと非標準open()過負荷を持っています。ただし、delete共有はサポートされているフラグの1つではありません。

    しかし、代わりがあります。 Visual Studioのバージョンstd::ifstreamstd::ofstreamには、ファイルアクセスのためにFILE*を受け入れる非標準のコンストラクタがあります。 Microsoft以外のコンパイラへの移植性の何かが必要な場合は

    Can I use CreateFile, but force the handle into a std::ofstream?

    HANDLE file_handle = CreateFile(...,FILE_SHARE_DELETE,...); 
    int file_descriptor = _open_osfhandle((intptr_t)file_handle, _O_RDONLY); 
    FILE* file = _fdopen(file_descriptor, "r"); 
    std::ifstream stream(file); 
    ... 
    // Closes stream, file, file_descriptor, and file_handle. 
    stream.close(); 
    

    :あなたは(エラー処理を簡潔にするため削除)例えば、Microsoftの_open_osfhandle()_fdopen()機能を使用してFILE*CreateFile()からHANDLEをラップすることができますカスタムstd::basic_streambufクラスを作成するか(std::filebufから派生した)、HANDLEをラップして、そのクラスのオブジェクトをstd::basic_istreamコンストラクタに直接渡す必要があります。

    関連する問題