現在、ファイル名の文字列にサフィックスを追加して未使用のファイル名を検索しようとするループがあります。ファイルが見つからない場合は、その名前を使用して、その名前で新しいファイルを開きます。問題は、このコードが Web サイトで使用され、同時に同じことを実行しようとする複数の試行が発生する可能性があるため、競合状態が発生することです。
チェックの時間と他のスレッドでのオープンの時間の間にファイルが作成された場合、Python が既存のファイルを上書きしないようにするにはどうすればよいですか。
サフィックスをランダム化することでその可能性を最小限に抑えることができますが、パス名の一部に基づいてその可能性はすでに最小限に抑えられています。存在しない場合にのみこのファイルを作成するように指示できる関数を使用して、その可能性を排除したいと考えています。
これを行うには Win32 関数を使用できますが、最終的には Linux でホストされるため、クロスプラットフォームで動作するようにしたいと考えています。
ベストアンサー1
使用os.open()
os.O_CREAT
とを使用しos.O_EXCL
てファイルを作成します。ファイルがすでに存在する場合は失敗します。
>>> fd = os.open("x", os.O_WRONLY | os.O_CREAT | os.O_EXCL)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'x'
新しいファイルを作成したら、os.fdopen()
ハンドルを標準の Python ファイル オブジェクトに変換するには:
>>> fd = os.open("y", os.O_WRONLY | os.O_CREAT | os.O_EXCL)
>>> f = os.fdopen(fd, "w") # f is now a standard Python file object
編集:Python 3.3からは、組み込みのopen()
x
「排他的作成のために開き、ファイルがすでに存在する場合は失敗する」ことを意味するモードがあります。