私は大きな(2〜4GB)ファイルを印刷するC++プログラムを作成しています。ファイルを保存するのに十分なディスク容量があるかどうかを確認します。予約する
の前に、ドライブに十分な空き容量があることを確認して、の前に書き始めます。可能であれば、私はこのスペースを予約したいと思います。
これは、Linuxベースのシステムで行われています。
これを行うにはどうすればよいですか?
私は大きな(2〜4GB)ファイルを印刷するC++プログラムを作成しています。ファイルを保存するのに十分なディスク容量があるかどうかを確認します。予約する
の前に、ドライブに十分な空き容量があることを確認して、の前に書き始めます。可能であれば、私はこのスペースを予約したいと思います。
これは、Linuxベースのシステムで行われています。
これを行うにはどうすればよいですか?
は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
から取得する標準的な方法はありません。
これを念頭において、私はディスクスペースの事前割り当てをプロセスの別のステップにします。それは:
open()
ファイルです。posix_fallocate()
;close()
ファイル。これは、fstream
を開く前に呼び出される短い関数に変えることができます。
aixの回答(posix_fallocate()
)を使用しますが、C++ストリームを使用しているので、ストリームのファイル記述子を取得するために少しのハックが必要です。
この場合、コードはhttp://www.ginac.de/~kreckel/fileno/です。
これはCスタイルの機能のようです。それをC++のストリーム演算子とどのように混ぜるべきか考えていますか? – Richard
@リチャード:あなたは 'ostream'の' fd'を手に入れようとすることができますが、AFAIKには標準的な方法はありません。私は個人的にファイルを 'open()'し、 'posix_fallocate()'と 'close()'を使います。次に、C++ I/Oを使用して再オープンしたり、内容を書き込んだりすることができます。 – NPE
必要があれば、低レベルの 'read()'と 'write()'をラップするために独自のstreambufを書くこともできます誰もあなたの下のファイルを置き換えることはありません。しかし、おそらく再オープンは簡単です。 – bdonlan