C #에서 빈 파일 만들기


186

C # /. NET에서 빈 파일을 만드는 가장 간단하고 표준적인 방법은 무엇입니까?

내가 지금까지 찾을 수있는 가장 간단한 방법은 다음과 같습니다.

System.IO.File.WriteAllLines(filename, new string[0]);

답변:


384

사용 File.Create하면 파일이 열린 상태로 유지되며 원하는 파일이 아닐 수도 있습니다.

당신은 사용할 수 있습니다 :

using (File.Create(filename)) ;

약간 이상하게 보입니다. 대신 중괄호를 사용할 수 있습니다.

using (File.Create(filename)) {}

또는 Dispose직접 전화하십시오 .

File.Create(filename).Dispose();

어느 쪽이든, 여러 곳에서 이것을 사용하려면 도우미 메소드로 감싸는 것을 고려해야합니다.

public static void CreateEmptyFile(string filename)
{
    File.Create(filename).Dispose();
}

호출하는 것을 참고 Dispose대신 사용하는 직접 using유일한 방법은 - 문하는 것은 정말 지금까지 내가 말할 수있는 여기에 많은 차이가되지 않습니다 스레드가 호출 사이에 중단 된 경우 차이가 확인 File.Create및 호출 Dispose. 해당 경쟁 조건이 존재하는 경우 값이 반환되기 직전에 메소드의 끝에서 스레드가 중단 된 경우 버전 에도 존재 한다고 생각합니다 ...usingFile.Create


8
이상한. 방금 5 분 전에 같은 코드를 작성했습니다. File.Create (filename) .Close ()를 수행했습니다. 같은 차이 ...
브라이언 Genisio

2
내 코드는을 사용 using (File.Create(filename)) ;했지만 다음과 같은 단순함을 좋아합니다.File.Create(filename).Dispose();
Vadim

@BrianGenisio : 방금 약 5 분 전에 같은 코드를 수행했습니다! 방금 다른 프로그래머가 어떻게했는지 보았습니다. 이제 File.Create(filename).Dispose();대신 사용하고 있습니다.
Jack

1
@ user3791372 : Close()리소스도 해제합니다. Close()그냥 전화 -github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…Dispose 참조
Jon Skeet

1
파일이 이미 존재하고 읽기 전용이 아닌 경우 파일 내용을 덮어 씁니다. 이것을 피하려면using (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden의

34
File.WriteAllText("path", String.Empty);

또는

File.CreateText("path").Close();

2
첫 번째 파일을 사용하면 파일 길이는 3 바이트입니다 (인코딩 코드). 두 번째를 사용하면 파일은 0 바이트입니다 (실제로 비어 있음).
Fil

1
@Fil : 확실합니까? 설명서File.WriteAllText(string, string) 에는 " BOM ( Byte-Order Mark)없이 UTF-8 인코딩" 을 사용 한다고 나와 있습니다. 그래도 여전히 보이면 WriteAllText 또는보고 할 가치가있는 문서의 버그 일 것입니다.
Heinzi

내가 시도한 것을 기억합니다. 이전 .Net 버전의 오래된 버그 일 수 있습니까? UTF8 인코딩 (또는 유니 코드 등)을 사용하도록 명시 적으로 지정하면 파일이 비어 있지 않습니다. <File.WriteAllText ( "c : \ del.txt", String.Empty, System.Text.Encoding.UTF8);>

1
@Fil Encoding.UTF8은 BOM (Byte Order Mark)을 출력하는 인코더를 반환합니다. new UTF8Encoding(false)BOM을 출력하지 않는 UTF8 인코더를 얻는 데 사용할 수 있습니다 .
Daniel Crabtree

1
WriteAllText이전 버전의 .NET에서 실제로 다르게 동작하는지 알 수 없습니다 . 그러나 확실하게 인코딩 부분을 건너 뛰고 File.WriteAllBytes(path, new byte[] { });대신 사용하십시오.
Jürgen Steinblock 2018 년

20
System.IO.File.Create(@"C:\Temp.txt");

다른 사람들이 지적 했듯이이 객체를 폐기하거나 빈 using 문으로 감싸 야합니다.

using (System.IO.File.Create(@"C:\Temp.txt"));

4
물건을 더 잘 처분하지 않습니까? 예 : using (System.IO.File.Create (filepath)) {}
kentaromiura

@ kentaromiura : 내 생각은 정확하게, 따라서 내 대답 :)
Jon Skeet

4

리턴 된 오브젝트에서 메소드를 체인화 할 수 있으므로 단일 명령문에서 방금 연 파일을 즉시 닫을 수 있습니다.

File.Open("filename", FileMode.Create).Close();

4

실수로 기존 파일을 덮어 쓰지 않으려면 다음을 사용하십시오.

using (new FileStream(filename, FileMode.CreateNew)) {}

... 파일이 이미 존재하는 경우 발생할 IOException을 처리하십시오.

File.Create다른 답변에서 제안 된, 파일이 이미 존재하는 경우의 내용을 덮어 씁니다. 간단한 경우에는을 사용하여이를 완화 할 수 File.Exists()있습니다. 그러나 여러 스레드 및 / 또는 프로세스가 동일한 폴더에 동시에 파일을 작성하려고하는 시나리오에서는보다 강력한 것이 필요합니다.


2

빈 파일을 만드는 다소 일반적인 사용 사례는보다 복잡한 프로세스 통신이없는 경우 다른 프로세스에서 발생하는 다른 작업을 트리거하는 것입니다. 이 경우 파일 생성을 외부 세계의 관점에서 원자 적으로 만드는 데 도움이 될 수 있습니다 (특히 트리거되는 것이 트리거를 "소비"하기 위해 파일을 삭제하는 경우).

따라서 만들려는 파일과 동일한 디렉토리에 정크 이름 (Guid.NewGuid.ToString ())을 만든 다음 임시 이름에서 원하는 이름으로 File.Move를 수행하면 도움이됩니다. 그렇지 않으면 파일 존재를 확인한 다음 트리거를 삭제하는 트리거 된 코드는 파일이 완전히 닫히기 전에 파일이 삭제되는 경합 상태가 될 수 있습니다.

임시 파일을 같은 디렉토리 (및 파일 시스템)에두면 원하는 원 자성을 얻을 수 있습니다. 이것은 같은 것을 제공합니다.

public void CreateEmptyFile(string path)
{
    string tempFilePath = Path.Combine(Path.GetDirectoryName(path),
        Guid.NewGuid.ToString());
    using (File.Create(tempFilePath)) {}
    File.Move(tempFilePath, path);
}

0

Path.GetTempFileName ()은 고유 한 이름의 빈 파일을 만들고 경로를 반환합니다.

경로를 제어하고 임의의 파일 이름을 얻으려면 GetRandomFileName을 사용하여 파일 이름 문자열을 반환하고 Create와 함께 사용할 수 있습니다

예를 들면 다음과 같습니다.

string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);

IMHO GetTempFileName ()의 이름이 완전히 잘못되었습니다.
kay.herzam

이 답변이 왜 도움이되지 않습니까?
Crippledsmurf

5
다음과 같은 두 가지 이유로 도움이되지 않습니다. 2. 파일이 닫히지 않습니다. 즉, 나중에 다른 파일 작성기를 열거 나 파일을 이동하려고하면 파일이 실패합니다.
River Satya

나는 당신의 요점을 취합니다 : 1. 모든 파일에는 이름이 필요합니다. 간단했습니다. 어떤 것과도 충돌하지 않는 것을 얻는 편리한 방법 단순성을 기하기 위해 질문에 초점을 맞추기
Crippledsmurf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.