2008-08-21 9 views
14

可能性の重複:
Creating tempory foldersC#で一時ファイルを作成するには?

私はPythonでtempfileモジュールのようなものを探しています:への書き込みのためにファイルを開くための(好ましくは)安全な方法。これは私が完了したときに削除するのは簡単なはずです

tempfileモジュールの "batteries included"機能は.NETにはないようですが、ファイルを作成するだけでなく、ファイル記述子を返します(古い学校、私は知っている...)それに沿ってパス。同時に、それは確かにのみ作成し、ユーザーがファイルやその他もろもろ(mkstemp()と思う)にアクセスすることができます:https://docs.python.org/library/tempfile.html


ああ、はい、私はそれを見ることができます。しかし、GetTempFileNameには欠点があります。ファイルを作成したとき(GetTempFileNameを呼び出すと0バイトファイルが作成されるとき)と、GetTempFileNameが返されたときにファイルを開くときの間に競合状態があります。これは私の現在のアプリケーションではありませんが、セキュリティ上の問題かもしれません...

+0

は、それがSystem.IO.GetTempPathではないでしょうか? – Biri

答えて

0

これを行うための(フレームワーク内の)クラスはありませんが、それほど多くはありません独自のロールする問題..

もちろん、それはあなたがそれに書き込みたいデータの種類に依存し、「セキュリティ」は必要な.. DevFusion上

This articleは、開始するには良い場所かもしれ?

6

Path.GetTempFileNameおよびPath.GetTempPath。次に、this linkを使用して、暗号化されたデータをファイルに読み書きします。

注:.NETは、クリティカルなセキュリティアプリケーション用の最適なプラットフォームではありません。クリティカルなデータをハッカーに公開する可能性のある落とし穴を避けるためには、CLRの仕組みに精通している必要があります。

編集:競合状態について...あなたはGetTempPathを使用することができ、その後、

Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP")) 
+0

@マシエ:正しい! – Will

23

を使用して、一時的なファイル名を作成し、私は以前と同じ要件をも持っていた、と私は小さなクラスを作成しました

public sealed class TemporaryFile : IDisposable { 
    public TemporaryFile() : 
    this(Path.GetTempPath()) { } 

    public TemporaryFile(string directory) { 
    Create(Path.Combine(directory, Path.GetRandomFileName())); 
    } 

    ~TemporaryFile() { 
    Delete(); 
    } 

    public void Dispose() { 
    Delete(); 
    GC.SuppressFinalize(this); 
    } 

    public string FilePath { get; private set; } 

    private void Create(string path) { 
    FilePath = path; 
    using (File.Create(FilePath)) { }; 
    } 

    private void Delete() { 
    if (FilePath == null) return; 
    File.Delete(FilePath); 
    FilePath = null; 
    } 
} 

指定したフォルダまたはシステムの一時フォルダに一時ファイルが作成されます。これは使い捨てクラスなので、その末尾(Disposeまたはデストラクタのいずれか)にファイルを削除します。 FilePathプロパティを使用して、作成されたファイル(およびパス)の名前を取得します。確かにそれを拡張してファイルを開いて書いてもらうと、関連するFileStreamを返すことができます。

使用例:私はPath.GetTempDirectoryを見ていない

using (var tempFile = new TemporaryFile()) { 
    // use the file through tempFile.FilePath... 
} 
+0

〜TemporaryFileのようなfinalizersメソッドは危険ですか? – Kiquenet

+12

剣は危険ですか?それとも、それを支えるのは侍ですか? –