2012-02-28 2 views
4

私は大きな(2〜4GB)ファイルを印刷するC++プログラムを作成しています。ファイルを保存するのに十分なディスク容量があるかどうかを確認します。予約する

の前に、ドライブに十分な空き容量があることを確認して、の前に書き始めます。可能であれば、私はこのスペースを予約したいと思います。

これは、Linuxベースのシステムで行われています。

これを行うにはどうすればよいですか?

答えて

7

posix_fallocate()を見てみましょう:

NAME 
     posix_fallocate - allocate file space 

SYNOPSIS 

     int posix_fallocate(int fd, off_t offset, off_t len); 

DESCRIPTION 
     The function posix_fallocate() ensures that disk space is allocated for 
     the file referred to by the descriptor fd for the bytes in the range 
     starting at offset and continuing for len bytes. After a successful 
     call to posix_fallocate(), subsequent writes to bytes in the specified 
     range are guaranteed not to fail because of lack of disk space. 

編集あなたがファイルに書き込むためにC++ストリームを使用することを示しているコメントで。私が知る限り、ファイルディスクリプタ(fd)をstd::fstreamから取得する標準的な方法はありません。

これを念頭において、私はディスクスペースの事前割り当てをプロセスの別のステップにします。それは:

  1. open()ファイルです。
  2. 使用posix_fallocate();
  3. close()ファイル。

これは、fstreamを開く前に呼び出される短い関数に変えることができます。

+2

これはCスタイルの機能のようです。それをC++のストリーム演算子とどのように混ぜるべきか考えていますか? – Richard

+1

@リチャード:あなたは 'ostream'の' fd'を手に入れようとすることができますが、AFAIKには標準的な方法はありません。私は個人的にファイルを 'open()'し、 'posix_fallocate()'と 'close()'を使います。次に、C++ I/Oを使用して再オープンしたり、内容を書き込んだりすることができます。 – NPE

+0

必要があれば、低レベルの 'read()'と 'write()'をラップするために独自のstreambufを書くこともできます誰もあなたの下のファイルを置き換えることはありません。しかし、おそらく再オープンは簡単です。 – bdonlan

1

aixの回答(posix_fallocate())を使用しますが、C++ストリームを使用しているので、ストリームのファイル記述子を取得するために少しのハックが必要です。

この場合、コードはhttp://www.ginac.de/~kreckel/fileno/です。

関連する問題