ディレクトリにフォルダが存在するかどうかを確認し、C#を使用して作成します


100

ディレクトリC:/にという名前のフォルダーが含まれているかどうかを確認MP_Uploadし、存在しない場合は、フォルダーを自動的に作成するにはどうすればよいですか?

Visual Studio 2005 C#を使用しています。

回答:


209

これは役立つはずです:

using System.IO;
...

string path = @"C:\MP_Upload";
if(!Directory.Exists(path))
{
    Directory.CreateDirectory(path);
}

4
System.IOを使用します。最初にも必要
fnc12 2015年

169
using System.IO;
...

Directory.CreateDirectory(@"C:\MP_Upload");

Directory.CreateDirectoryは、まさにあなたが望んでいることを行います。ディレクトリがまだ存在しない場合は、それを作成します。最初に明示的なチェックを行う必要はありません。

pathに指定されたすべてのディレクトリは、それらがすでに存在していないか、pathの一部が無効でない限り作成されます。pathパラメータは、ファイルパスではなく、ディレクトリパスを指定します。ディレクトリがすでに存在する場合、このメソッドは何もしません。

(これは、パスに沿ったすべてのディレクトリが必要に応じて作成されることも意味します。まだ存在しなくCreateDirectory(@"C:\a\b\c\d")ても十分C:\aです。)


ただし、ディレクトリの選択については注意が必要C:\です。システムパーティションのルートのすぐ下にフォルダーを作成するのは困難です。ユーザーにフォルダーを選択させるか、フォルダーを作成する%APPDATA%か、%LOCALAPPDATA%その代わりにフォルダーを作成することを検討してください(そのためにはEnvironment.GetFolderPathを使用してください)。Environment.SpecialFolder列挙のMSDNページには、特別なオペレーティングシステムフォルダーとその目的のリストが含まれています。


4
私自身はそれを知りませんでした。私は恥ずかしいと思います; 私は何年も存在しない場合は作成してきました。

10
これは他のいくつかのスレッドで発生しています。チェックする必要はありませんが、コードの意図がより明確になり、部外者にとって読みやすくなります。したがって、チェックを維持することは良いことです。
Matt J.

6
@MattJ .:その場合、役に立たない関数呼び出しではなく、短いコメントを追加します。この動作は明白ではないことに同意しますが、その一方で、(より適切に)名前を付けるとEnsureDirectoryExistsメソッドを見つけにくくなります。
Heinzi 2013年

3
注意点:Directory.CreateDirectoryフォルダー名が既存のファイル名と一致する場合にスローされます。
Reza M. 14

11
if(!System.IO.Directory.Exists(@"c:\mp_upload"))
{
     System.IO.Directory.CreateDirectory(@"c:\mp_upload");
}

1
はい、もちろん、私は少し推測していました。すべての小さなメソッド名を覚えようとしているのは...そして私はVSを起動するのが面倒でした...これのポイント-私にとって-は、アイデアを提供することで質問者を助けることです。変更:彼らは、これらすべてのささいなことは、コピー&ペースト優しい、彼らは少し考える必要が、その後...、あまりにも、右...修正することを期待する場合CreateCreateDirectory:)

6

これはうまくいくはずです

if(!Directory.Exists(@"C:\MP_Upload")) {
    Directory.CreateDirectory(@"C:\MP_Upload");
}

1
using System;
using System.IO;
using System.Windows.Forms;

namespace DirCombination 
{
    public partial class DirCombination : Form
    {
        private const string _Path = @"D:/folder1/foler2/folfer3/folder4/file.txt";
        private string _finalPath = null;
        private string _error = null;

        public DirCombination()
        {
            InitializeComponent();

            if (!FSParse(_Path))
                Console.WriteLine(_error);
            else
                Console.WriteLine(_finalPath);
        }

        private bool FSParse(string path)
        {
            try
            {
                string[] Splited = path.Replace(@"//", @"/").Replace(@"\\", @"/").Replace(@"\", "/").Split(':');
                string NewPath = Splited[0] + ":";
                if (Directory.Exists(NewPath))
                {                    
                    string[] Paths = Splited[1].Substring(1).Split('/');

                    for (int i = 0; i < Paths.Length - 1; i++)
                    {
                        NewPath += "/";
                        if (!string.IsNullOrEmpty(Paths[i]))
                        {
                            NewPath += Paths[i];
                            if (!Directory.Exists(NewPath))
                                Directory.CreateDirectory(NewPath);
                        }
                    }

                    if (!string.IsNullOrEmpty(Paths[Paths.Length - 1]))
                    {
                        NewPath += "/" + Paths[Paths.Length - 1];
                        if (!File.Exists(NewPath))
                            File.Create(NewPath);
                    }
                    _finalPath = NewPath;
                    return true;
                }
                else
                {
                    _error = "Drive is not exists!";
                    return false;
                }
            }
            catch (Exception ex)
            {
                _error = ex.Message;
                return false;
            }
        }
    }
}


0

あなたはこれを試すことができます。

using System.IO;string path = "C:\MP_Upload";if(!Directory.Exists(path)){
   Directory.CreateDirectory(path);}

これは不適切なフォーマットの受け入れられた回答の直接のコピーですが、これはどのようにSOを改善すると思われますか?
Tarick Welling
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.