폴더가없는 경우 파일과 폴더를 어떻게 만듭니 까?


136

다음 파일을 작성 (또는 덮어 쓰기)하고 싶다고 상상해보십시오. C:\Temp\Bar\Foo\Test.txt

은 Using File.Create (..) 방법이 그것을 할 수 있습니다.

그러나 다음 폴더 중 하나가없는 경우 (위의 예제 경로에서)

  • 온도

그런 다음 DirectoryNotFoundException이 발생합니다.

.. 경로가 주어지면 해당 경로에 대한 파일 ..을 만드는 데 필요한 모든 폴더를 어떻게 재귀 적으로 만들 수 있습니까? Temp 또는 Bar 폴더가 있지만 Foo가 없으면 ...도 생성됩니다.

간단하게하기 위해 보안 문제가 없다고 가정합니다.



답변:


122
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

참조 이 MSDN 페이지를 .

그것이 도움이 되길 바랍니다!


82
먼저 확인 Directory.CreateDirectory하지 않고 맹목적으로 전화를 걸 수 있습니다 Directory.Exists-디렉토리가 이미 있으면 던져지지 않습니다.
팀 로빈슨

1
@Tim : 확실치 않아서 누구든지 던졌습니다. 정보 주셔서 감사합니다.
Christopher B. Adkins

24
그리고 Path.GetDirectoryName(string path)전체 경로에서 디렉토리를 가져 오는 것을 잊지 마십시오
Oliver

@Oliver : Directory 및 DirectoryInfo 클래스와 함께 사용되는 많은 기능이 있지만, 내가 준 코드는 그에게 올바른 방향으로 나아가는 데 충분했습니다. 링크도 상당히 확장 된 것 같습니다.
Christopher B. Adkins

8
* 참고 : 변수 path는 파일 이름을 포함하지 않아야합니다. 따라서 OP의 예를 사용하는 것은 path이어야합니다 C:\Temp\Bar\Foo. 전화 한 후에도 파일을 작성하려면 Directory.CreateDirectory(path);전화해야 File.Create("C:\Temp\Bar\Foo\Test.txt");합니다.
sazr

139

다른 답변에서 언급 된 내용을 요약하려면 :

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory 디렉토리를 재귀 적으로 작성하며 디렉토리가 이미 존재하는 경우 오류없이 리턴됩니다.

에 파일이 Foo있는 경우C:\Temp\Bar\Foo예외에 있으면 예외가 발생합니다.


당신이 긴 경로를 처리하는 경우 (256+)를 참조 stackoverflow.com/questions/5188527/...을
알렉세이 Levenkov


3

. 경로를 지정하면 파일을 만드는 데 필요한 모든 폴더를 재귀 적으로 만드는 방법은 무엇입니까?

path로 지정된 모든 디렉토리 및 서브 디렉토리를 작성합니다.

Directory.CreateDirectory(path);

그러면 파일을 만들 수 있습니다.


2
파일 이름이없는 경로 :)
Sameera R.

"모든 디렉토리 및 서브 디렉토리"잘못된 : 최대 하나의 디렉토리 및 필요한 모든 서브 디렉토리를 작성합니다.
Camilo Terevinto 2016 년

3

경로의 두 부분 (디렉토리 및 파일 이름)을 확인하고 존재하지 않는 경우이를 작성해야합니다.

File.Exists및 사용 하여 Directory.Exists존재하는지 확인 하십시오 . Directory.CreateDirectory전체 경로를 만들므로 디렉토리가 존재하지 않으면 한 번만 호출하면 파일을 만들 수 있습니다.


Directory.CreateDirectory의 경우 존재하는 부분을 볼 필요가 없습니다. 필요한 모든 디렉토리를 작성합니다 (대상 디렉토리가 아직 존재하지 않는지 확인하십시오).
Gertjan

이 경우 루트에서 각 부분을 확인할 필요가 없으므로 전체 경로를 확인하고 존재하지 않는 경우 만들면되므로 첫 번째 줄을 제거하는 것이 좋습니다.
Gertjan

@Gertjan-답변이 업데이트되었습니다 ... 지금 귀하의 표준을 충족하기를 바랍니다.)
Oded

:) 그것은 :) (당신을 잘못 증명하거나 당신을 화나게 내 요점이 아니었지만 초보자는 답변에 어떤 설명을 사용할 수 있습니다)
Gertjan


0

Directory.CreateDirectory ()를 원합니다.

다음은 내가 사용하는 클래스 (C #으로 변환)에 소스 디렉토리와 대상을 전달하면 해당 디렉토리의 모든 파일과 하위 폴더가 대상으로 복사됩니다.

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

        if (!Directory.Exists(destination)) {
            Directory.CreateDirectory(destination);
        }

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

    if (!Directory.Exists(destination)) {
        Directory.CreateDirectory(destination);
    }

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}


2
이 줄 때문에 이것을 다운 그레이드해야합니다 : using Microsoft.VisualBasic;Evil !!
Pure.Krome

2
그리고 왜 Microsoft.VisualBasic이 사악합니까? .Net Framework의 다른 사람과 같은 어셈블리입니다.
Oliver

2
다른 언어의 네임 스페이스를 불필요하게 가져 오기 때문에 ..?
Markive

0

어셈블리 / exe에 FileIO 권한이 있다고 가정하면 옳지 않습니다. 응용 프로그램이 관리자 권한으로 실행되지 않을 수 있습니다. 코드 액세스 보안권한 요청 을 고려해야 합니다. 샘플 코드 :

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

.NET 코드 액세스 보안 이해

실제 사용하는 "코드 액세스 보안"이 있습니까?


1
@ Pure.Krome : 제 답변은 목표가 아니지만 권한있는 리소스에 액세스 할 때 보안 및 액세스 제어를 고려하십시오. 절대로 당신의 질문을 추월하거나 복잡하게하려고하지 않았습니다 :)
PRR

0

여기에 다른 답변이 있지만 그중 아무것도 완료되지 않았으므로 다음 코드는 디렉토리만들고 (존재하지 않는 경우) 파일복사합니다 .

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.