[c#] File.Create ()를 사용한 후 다른 프로세스에서 사용중인 파일

런타임에 파일이 있는지 감지하려고합니다. 그렇지 않은 경우 파일을 만듭니다. 그러나 쓰기를 시도 할 때이 오류가 발생합니다.

다른 프로세스에서 사용 중이므로 프로세스가 ‘myfile.ext’파일에 액세스 할 수 없습니다.

string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
if (!File.Exists(filePath))
{
    File.Create(filePath);
}

using (StreamWriter sw = File.AppendText(filePath))
{
    //write my text 
}

그것을 고치는 방법에 대한 아이디어가 있습니까?



답변

File.Create메서드는 파일을 만들고 파일에서을 엽니 다 FileStream. 따라서 파일이 이미 열려 있습니다. file.Create 메서드가 전혀 필요하지 않습니다.

string filePath = @"c:\somefilename.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
    //write to the file
}

StreamWriter생성자 의 부울 은 파일이 존재하는 경우 내용이 추가되도록합니다.


답변

    File.Create(FilePath).Close();
    File.WriteAllText(FileText);

이 답변을 업데이트하여 이것이 실제로 모든 텍스트를 작성하는 가장 효율적인 방법이 아니라고 말하고 싶습니다. 빠르고 더러운 것이 필요한 경우에만이 코드를 사용해야합니다.

제가이 질문에 답했을 때 저는 젊은 프로그래머 였고, 그때 저는이 대답을 생각 해낸 어떤 천재라고 생각했습니다.


답변

텍스트 파일을 만들 때 다음 코드를 사용할 수 있습니다.

System.IO.File.WriteAllText("c:\test.txt", "all of your content here");

댓글의 코드를 사용합니다. 생성 한 파일 (스트림)을 닫아야합니다. File.Create는 방금 생성 된 파일에 파일 스트림을 반환합니다. :

string filePath = "filepath here";
if (!System.IO.File.Exists(filePath))
{
    System.IO.FileStream f = System.IO.File.Create(filePath);
    f.Close();
}
using (System.IO.StreamWriter sw = System.IO.File.AppendText(filePath))
{
    //write my text 
}


답변

FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();


답변

File.Create는 FileStream을 반환합니다. 파일에 쓸 때 닫아야합니다.

using (FileStream fs = File.Create(path, 1024))
        {
            Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");
            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }

파일을 자동으로 닫기 위해 using을 사용할 수 있습니다.


답변

코드 스 니펫으로 질문을 업데이트했습니다. 적절한 들여 쓰기 후 문제가 무엇인지 즉시 명확하게 알 수 있습니다. 사용 File.Create()하지만 FileStream반환 되는 것을 닫지 마십시오 .

그런 식으로 이렇게하면, 불필요 StreamWriter이미 기존 파일에 추가 허용 하고 아직 존재하지 않는 경우 새 파일을 생성. 이렇게 :

  string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
  using (StreamWriter sw = new StreamWriter(filePath, true)) {
    //write my text 
  }

StreamWriter생성자를 사용 합니다 .


답변

이 질문은 이미 답변되었지만 여기에 디렉토리가 있는지 확인하고 텍스트 파일이 있으면 끝에 숫자를 추가하는 실제 솔루션이 있습니다. 내가 작성한 Windows 서비스에서 일일 로그 파일을 만드는 데 사용합니다. 누군가에게 도움이되기를 바랍니다.

// How to create a log file with a sortable date and add numbering to it if it already exists.
public void CreateLogFile()
{
    // filePath usually comes from the App.config file. I've written the value explicitly here for demo purposes.
    var filePath = "C:\\Logs";

    // Append a backslash if one is not present at the end of the file path.
    if (!filePath.EndsWith("\\"))
    {
        filePath += "\\";
    }

    // Create the path if it doesn't exist.
    if (!Directory.Exists(filePath))
    {
        Directory.CreateDirectory(filePath);
    }

    // Create the file name with a calendar sortable date on the end.
    var now = DateTime.Now;
    filePath += string.Format("Daily Log [{0}-{1}-{2}].txt", now.Year, now.Month, now.Day);

    // Check if the file that is about to be created already exists. If so, append a number to the end.
    if (File.Exists(filePath))
    {
        var counter = 1;
        filePath = filePath.Replace(".txt", " (" + counter + ").txt");
        while (File.Exists(filePath))
        {
            filePath = filePath.Replace("(" + counter + ").txt", "(" + (counter + 1) + ").txt");
            counter++;
        }
    }

    // Note that after the file is created, the file stream is still open. It needs to be closed
    // once it is created if other methods need to access it.
    using (var file = File.Create(filePath))
    {
        file.Close();
    }
}