フォルダが存在しない場合は作成します


720

アプリケーションでFileUploaderコントロールを使用しています。指定したフォルダにファイルを保存したい。このフォルダが存在しない場合は、まずフォルダを作成してから、このフォルダにファイルを保存します。フォルダーが既に存在する場合は、その中にファイルを保存するだけです。

どうすればできますか?


@JoeBlow-Ha-どの答えが間違っているかを指定する必要がありました-現在、ページはさらに混乱しています。(彼は受け入れられた回答を変更しましたか?それとも変更しませんでしたか?OMG!);-)
Bartosz

私は他のことを探している間にここに行きましたが、同じストーリーの独自のバージョンで互いに矛盾するために戦っている人がどれほど驚くかは驚くべきことです。マイクロソフトは.NET FrameworkとMSDNを作成しました。Monoなどの他の実装者が正しい動作を尊重するかどうかは、MSDNで説明されている動作の正確さとは無関係です。あ、そしてMonoも正しいことをするので、議論はどこにあるのでしょうか?
monkey0506 2017

回答:


1239

他の人が言ったように、 System.IO.Directory.CreateDirectory

ただし、それが最初に存在するかどうかを確認する必要はありません。ドキュメントから

それらがすでに存在していないか、またはパスの一部が無効でない限り、パスで指定されたすべてのディレクトリが作成されます。ディレクトリがすでに存在する場合、このメソッドは新しいディレクトリを作成しませんが、既存のディレクトリのDirectoryInfoオブジェクトを返します。


32
.NET Framework 4.5バージョンの場合
イゴールクストフ2014年

25
それでも、マイクロソフトのコード例は、ディレクトリが最初に存在するかどうかをチェックすることで矛盾しています...
ecoe

1
それが存在するかどうかを確認する必要がありますか?チェックしてからCreateDirectoryメソッドもチェックすると、2回チェックが行われます...そして、AFAIKファイルシステムの操作は
負荷

3
@Muflix like this-たとえば「FILENAME」などのファイルをディレクトリに作成しますが、拡張子は付けません。次に、Directory.Exists( "FILENAME")を呼び出してみてください。そのようなディレクトリがないため、falseが返されます。ここで、CreateDirectory( "FILENAME")を呼び出すと、その名前の「何か」が既に存在するため、必要に応じて無惨に失敗します。それが理にかなっていると思います。
のOtavioDécio

1
違う!フォルダーが存在するかどうかを確認する必要があります。この方法に深刻な問題があることを確認しました。フォルダーの存在を確認しないと、特に解放しない限り、フォルダーハンドルがリークします。この例は、数百万のフォルダを処理するアプリケーションで使用しました。このメソッドが呼び出されるたびに、アプリケーションはディレクトリへのファイルハンドルを保持しました。数時間後、Corporate Network NASはフォルダで何百万ものファイルハンドルを開いていました。小切手を無料で含めるように更新
soddoff Baldrick

356

http://forums.asp.net/p/1226236/2209871.aspxに従って、以下のコードを使用します。

string subPath ="ImagesPath"; // your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

41
理由:if(!Directory.Exists(path_to_check))Directory.CreateDirectory(path_to_check);
Dayan 2013年

159
フォルダが存在するかどうかを確認する必要はありません。取扱説明書をよくお読みください。
13

30
チェックと作成はアトミックではありません。上記のコードはにおいがします、競合状態があります。無条件でディレクトリを作成しFileExists、関数がスローするように設計されている場合は、(またはC#の同等の)例外をキャッチすることをお勧めします。
Jo So

6
他の人が指摘したように、を呼び出す必要はなく、Exists実際には新しい障害状態が発生します。
Ed S.

3
@MartinSmith:次に、ディレクトリを作成します。以前に存在を確認しないでください。それだけではありません。また、APIが何であるかという誤った印象を与えませんSystem.IO.Directory.CreateDirectory。(それはより高速ですが、おそらくそれは問題ではありません)
Jo So

224

この行を書くだけです:

System.IO.Directory.CreateDirectory("my folder");
  • フォルダがない場合は、まだ存在していない、それがされます作成しました
  • フォルダがすでに存在する場合、その行は無視されます。

参照:MSDNのDirectory.CreateDirectoryに関する記事

もちろん、using System.IO;ソースファイルの先頭に書き込みDirectory.CreateDirectory("my folder");、フォルダーを作成するたびに書き込むこともできます。


28

Directory.CreateDirectory FilePathが存在しない場合に、試行して作成する方法を説明します

Directory.ExistsFilePathが存在するかどうかを確認する方法について説明します。ただし、CreateDirectoryがチェックするため、これは必要ありません。


@Tavousi jeroenhによって提供されるこの機能は良いスタートです;)
Allan Chua

msdn searchを介しても、msdnドキュメントリンクのいずれも現在機能していないようです...
jeroenh

リンクは正常です
Anand

これにより、競合状態が有効になります承認された回答を参照してください。
ComFreek

27

パスがまだ存在しない場合は、次のような方法で作成できます。

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

6
チェックif (!folderExists)は必要ありません。
13

8
@bazzilicはい、しかしそれは意図を明らかにします。APIがこれをどのように処理するかを推測する必要はありません(または確実に知っています)。このコードを読んだ人なら誰でも、何が起こるか確実にわかるでしょう。
Dennis Traub

4
マルチスレッド環境(ファイルシステムの状態など)では、ロックまたはトライアンドキャッチの選択肢しかありません。上記のスニペットには競合状態があります。関数はFileExists例外(またはC#で呼び出されるもの)をスローする可能性があります
Jo So

9
「意図を明らかにする」-これは正当な理由ではありません。コードにコメントを書くだけです。
ジムバルター2014

15

このメソッドは、存在しない場合はフォルダを作成し、存在する場合は何もしません

Directory.CreateDirectory(path);

15

try / catch句を使用して、存在するかどうかを確認できます。

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

8
これは良い答えですが、MSDNのドキュメントによると、「パスに指定されたすべてのディレクトリは、それらがすでに存在しないか、パスの一部が無効でない限り作成されます。pathパラメータは、ファイルパスではなくディレクトリパスを指定します。ディレクトリがすでに存在する場合、このメソッドは何もしません。 " そのため、Directory.Exists(path)を実際に呼び出す必要はありません。
ken

2
それは事実だが、それをチェックするのではなくかかわらず、MSDNは..言うのを前提とするために常に最善ですので、それはまた、assumtionだ
メソッド・マン

6
@DJクレーズ、それが間違っていることが証明されていない限り、MSDNを信じています。反対をお勧めします。MSDNの発言を無視して、余分な(不要な)チェックをコードに追加します。どこに線を引くのですか?
Polyfun 2012年

1
ShellShockどこにも無視とは言いません..これは私が仮定するよりも仮定しないほうがいいと言っている不思議な発言です..もう一度言ったことを読んでください。ありがとう
MethodMan

3
@DJKRAZE誰も何も想定していません。マニュアルではチェックが不要なことをわかりやすい英語で書いています。
13

14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);

12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectoryは、ディレクトリが存在しない場合のチェックをすでに処理しています。
bergmeister

6

次のコードは、存在しない場合にディレクトリを作成する、私が使用するコードの最良の行です。

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

ディレクトリがすでに存在する場合、このメソッドは新しいディレクトリを作成しませんが、既存のディレクトリのDirectoryInfoオブジェクトを返します。>


CreateDirectoryは、ディレクトリが存在しない場合のチェックをすでに処理しています。
bergmeister

@bergmeister、ありがとうございます。チェックを通過しました。条件付きチェックが本当に削除されました。更新されました。
UJS 2017年

5

親フォルダーのパスを指定して、新しいフォルダーを作成します。

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • 指定された新しいフォルダへのパス
  • ディレクトリ情報変数を使用して、好きなように操作し続けることができます。

0

以下のコードを使用してください。このコードを使用してファイルをコピーし、新しいフォルダーを作成しました。

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);

   }
   else
   {
      MessageBox.Show("no such files");

   }
}

0

string createfolder = "E:/ tmp /" + uId;
System.IO.Directory.CreateDirectory(createfolder);


0

フォルダーが画像フォルダーまたは他のフォルダーの下に表示されない場合は、このコードを使用します

 string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");
            bool exists = System.IO.Directory.Exists(subPath);
            if(!exists)
            System.IO.Directory.CreateDirectory(subPath); 
string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");

-1

おもしろい方法はFileUpload、必要なメソッドでを拡張することです。

これを追加:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.SaveAs(destination);
    }
}

次にそれを使用します:

FileUpload file;
...
file.SaveAs(path,true);

-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

CreateDirectoryは、サブディレクトリの作成にも使用されます。必要なのは、このサブディレクトリが作成されるディレクトリのパスを指定することだけです。次のコードスニペットは、にMaheshサブディレクトリを作成しC:\Temp directoryます。

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

複数の答えから導き出された/組み合わせたもので、私のためにそれを実装することはこれと同じくらい簡単でした:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

6
メソッドを本質的に正確なコピーにカプセル化し、名前がわずかに異なるだけの意味は何ですか?あなたは文字通りこれから何も得ません。
クリシック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.