폴더가 없으면 작성하십시오.


720

내 응용 프로그램에서 FileUploader 컨트롤을 사용합니다. 지정된 폴더에 파일을 저장하고 싶습니다. 이제이 폴더가없는 경우 먼저 폴더를 만든 다음 파일을이 폴더에 저장하고 싶습니다. 폴더가 이미 존재하면 파일을 저장하십시오.

어떻게해야합니까?


@JoeBlow-Ha-어떤 대답이 틀렸는 지 지정해야합니다. 이제 페이지가 더욱 혼동됩니다. (허용 된 답변을 바
꾸었

나는 다른 것들을 찾는 동안 여기에 왔지만, 같은 이야기의 자신의 버전으로 서로 모순되기 위해 얼마나 많은 사람들이 싸우고 있는지 놀랍습니다. Microsoft는 .NET Framework와 MSDN을 작성했습니다. Mono와 같은 다른 구현자가 올바른 동작을 존중하는지 여부는 MSDN에 설명 된 동작의 정확성과 관련이 없습니다. 아, 그리고 모노도 옳은 일을합니다. 그래서 논쟁은 어디에 있습니까?
monkey0506

답변:


1239

다른 사람들이 말했듯이 사용 System.IO.Directory.CreateDirectory

그러나 먼저 존재하는지 확인할 필요는 없습니다. 로부터 문서

이미 존재하거나 경로의 일부가 유효하지 않은 한 경로에 지정된 모든 디렉토리가 작성됩니다. 디렉토리가 이미 존재하는 경우이 메소드는 새 디렉토리를 작성하지 않지만 기존 디렉토리에 대한 DirectoryInfo 오브젝트를 리턴합니다.



25
그러나 마이크로 소프트 코드 예제는 디렉토리가 먼저 존재하는지 점검함으로써 스스로 모순된다 ...
ecoe

1
그래서 우리는 존재 여부를 확인해야합니까? 우리가 점검 한 다음 CreateDirectory 메소드 점검을 다시 확인하면, 우리는 점검을 두 번하고 ... AFAIK 파일 시스템 작업은 비쌉니다
Giox

3
@Muflix는 이와 같이-디렉토리에 "FILENAME"과 같은 파일을 생성하지만 확장자는 제공하지 않습니다. 그런 다음 Directory를 호출하십시오. Exists ( "FILENAME")는 그러한 디렉토리가 없기 때문에 false를 리턴합니다. 이제 CreateDirectory ( "FILENAME")를 호출하면 해당 이름을 가진 "무언가"가 있기 때문에 비참하게 실패합니다. 이해가 되길 바랍니다.
Otávio Décio

1
잘못된! 폴더가 존재하는지 확인해야합니다. 방금이 방법에 심각한 문제가 있음을 확인했습니다. 폴더가 있는지 확인하지 않으면 폴더를 구체적으로 놓지 않으면 폴더 핸들이 누수됩니다. 수백만 개의 폴더를 처리하는 응용 프로그램에서이 예를 사용했습니다. 이 메소드가 호출 될 때마다 응용 프로그램은 파일 핸들을 디렉토리에 보유했습니다. 몇 시간 후, 회사 네트워크 NAS는 폴더에서 수백만 개의 파일 핸들을 열었습니다. 체크 자유를 포함하도록 업데이트 핸들의
Baldrick soddoff

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

158
폴더가 존재하는지 확인할 필요가 없습니다. 설명서를주의 깊게 읽으십시오.
bazzilic

30
확인 및 생성은 원 자성이 아닙니다. 위의 코드는 냄새가 나고 경쟁 조건이 있습니다. 무조건 디렉토리를 작성 FileExists하고 함수가 예외를 던지도록 설계 된 경우 예외 (또는 C #에 해당하는 예외)를 포착하는 것이 좋습니다.
Jo So

6
다른 사람들이 지적했듯이, 호출 할 필요가 없으며 Exists실제로 새로운 실패 조건을 만듭니다.
Ed S.

3
@MartinSmith : 그런 다음 디렉토리를 만드십시오. 전에 존재를 확인하지 마십시오. 짧을뿐만 아니라 또한 API가 무엇인지에 대한 잘못된 인상을주지 않습니다 System.IO.Directory.CreateDirectory. (더 빠르지 만 중요하지는 않습니다)
Jo So

223

이 줄을 작성하십시오.

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 문서 링크 중 어느 것도 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)이 필요하지 않습니다.
bazzilic

8
@bazzilic 예, 그러나 의도를 보여줍니다. API가 어떻게 처리하는지 추측 할 필요가 없습니다. 이 코드를 읽는 사람은 어떻게 될지 확실히 알 것입니다.
Dennis Traub

4
멀티 스레드 환경 (예 : 파일 시스템 상태)에서는 잠금 또는 try-and-catch를 선택할 수 있습니다. 위의 스 니펫에는 경쟁 조건이 있습니다. 이 함수는 FileExists예외 (또는 C #에서 호출 된 것)를 던질 수 있습니다.
Jo So

9
"의도를 드러낸다"-이것은 정당화되지 않습니다. 코드에 주석을 작성할 수 있습니다.
Jim Balter

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의 말과 상관없이 항상 가정하는 것이 아니라 확인하는 것이 가장 좋습니다.
MethodMan

6
@DJ KRAZE, 나는 그것이 틀린 것으로 입증되지 않은 한 MSDN을 믿습니다. 당신은 반대를 권장합니다-MSDN의 말을 무시하고 코드에 불필요한 (필요하지 않은) 검사를 추가하십시오. 선은 어디에서 그리나요?
Polyfun

1
셸 쇼크는 곳이 내가이 생각하는 것보다 가정 더 나은하지에의 말을 오전 persumtious 문입니다 .. 내가 무시하는 말을하지 않는다 .. 난 다시 한번 .. 덕분에 진술 한 내용을 읽기
MethodMan

3
@DJKRAZE 아무도 아무것도 가정하지 않습니다. 점검이 필요하지 않은 설명서에는 일반 영어로 작성되었습니다.
bazzilic

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

4

이것은 내가 찾고있는 대답이지만 쉽게 찾지 못했습니다.

        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

문자열 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
약간 다른 이름으로 본질적으로 정확한 사본으로 메소드를 캡슐화하는 요점은 무엇입니까? 당신은 말 그대로 이것으로부터 아무것도 얻지 못합니다.
Krythic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.