Файл, используемый другим процессом после использования File.Create () - PullRequest
105 голосов
/ 06 мая 2010

Я пытаюсь определить, существует ли файл во время выполнения, если нет, создайте его. Однако я получаю эту ошибку, когда пытаюсь записать в нее:

Процесс не может получить доступ к файлу «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 
}

Есть идеи как это исправить?

Ответы [ 10 ]

130 голосов
/ 27 июля 2011
    File.Create(FilePath).Close();
    File.WriteAllText(FileText);

Я хочу обновить этот ответ, чтобы сказать, что это не самый эффективный способ написания всего текста. Вы должны использовать этот код, только если вам нужно что-то быстрое и грязное.

Я был молодым программистом, когда отвечал на этот вопрос, и тогда я думал, что был своего рода гением, чтобы придумать этот ответ.

104 голосов
/ 06 мая 2010

Метод File.Create создает файл и открывает FileStream в файле. Итак, ваш файл уже открыт. Вам вообще не нужен метод file.Create:

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

Логическое значение в конструкторе StreamWriter приведет к добавлению содержимого, если файл существует.

25 голосов
/ 06 мая 2010

При создании текстового файла вы можете использовать следующий код:

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 
}
16 голосов
/ 17 марта 2014
FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();
9 голосов
/ 06 мая 2010

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);
        }

Вы можете использовать для автоматического закрытия файла.

8 голосов
/ 06 мая 2010

Я обновил ваш вопрос с помощью фрагмента кода. После правильного отступа сразу становится ясно, в чем проблема: вы используете 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 конструктор .

1 голос
/ 02 августа 2018

Мне кажется, я знаю причину этого исключения. Возможно, вы выполняете этот фрагмент кода в нескольких потоках.

1 голос
/ 05 января 2018

Я знаю, что это старый вопрос, но я просто хочу добавить, что вы все еще можете использовать File.Create("filename")", просто добавьте .Dispose() к нему.

File.Create("filename").Dispose();

Таким образом, он создает и закрывает файл для следующего процесса, чтобы использовать его.

1 голос
/ 13 октября 2011

На этот вопрос уже дан ответ, но вот реальное решение, которое проверяет, существует ли каталог, и добавляет в конец число, если текстовый файл существует. Я использую это для создания ежедневных файлов журнала в службе 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();
    }
}
0 голосов
/ 12 февраля 2013

Попробуйте: в любом случае это работает, если файл не существует, он создаст его и затем запишет в него. И если он уже существует, без проблем он откроется и напишет:

using (FileStream fs= new FileStream(@"File.txt",FileMode.Create,FileAccess.ReadWrite))
{ 
     fs.close();
}
using (StreamWriter sw = new StreamWriter(@"File.txt")) 
 { 
    sw.WriteLine("bla bla bla"); 
    sw.Close(); 
 } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...