2015-01-07 3 views
1

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

private void btnCreate_Click(object sender, EventArgs e)   
{ 

    string path = @"C:\CSharpTestFolder\Test.txt"; 
    if (!File.Exists(path)) 
    { 
     File.Create(path); 
     using (StreamWriter sw = File.CreateText(path)) 
     { 
      sw.WriteLine("The first line!"); 
     } 

    } 
    else if (File.Exists(path)) 
     MessageBox.Show("File with this path already exists.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 

} 

При нажатии на кнопку «Создать», Visual Studio показывает ошибку «System.IO.DirectoryNotFoundException», который указывает на «File.Create (путь)».

Где проблема?

+3

Существует ли C: \ CSharpTestFolder? Работает ли ваш код, если вы его создаете? Имеются ли у вас соответствующие разрешения для редактирования папки? – Liath

+0

Нет, этого файла не существует. Когда я вручную создал этот путь и снова запустил программу, он показывает мне ту же ошибку, но файл «test.txt» в этом пути был сгенерирован программой, но когда я открыл ее, текста не было. Я не уверен, но я думаю, что у него есть разрешения на редактирование. – TheZerda

ответ

6

Исключение указывает, что ваш Каталог C:\CSharpTestFolder не существует. File.Create создаст файл в существующей папке/пути, он также не создаст полный путь.

Ваш чек File.Exists(path) вернет false, так как каталог не существует и файл. Сначала необходимо проверить Directory.Exists в папке, а затем создать каталог, а затем файл.

Включите файлы в файл try/catch. Вы не можете быть на 100% уверены в File.Exists и Directory.Exists, может быть другой процесс создания/удаления элементов, и вы можете столкнуться с проблемами, если будете полагаться исключительно на эти проверки.

Вы можете создать каталог, как:

string directoryName = Path.GetDirectoryName(path); 
Directory.CreateDirectory(directoryName); 

(Вы можете позвонить Directory.CreateDirectory без вызова Directory.Exists, если папка уже существует, он не бросает исключение), а затем проверить/создать файл

+0

См. Этот ответ для создания каталогов тоже http://stackoverflow.com/questions/3201598/how-do-i-create-a-file-and-any-folders-if-the-folders-dont-exist – Liath

5

Сначала вы должны создать каталог.

string directory = @"C:\CSharpTestFolder"; 

if(!Directory.Exists(directory)) 
    Directory.CreateDirectory(directory); 

string path = Path.Combine(directory, "Test.txt"); 
if (!File.Exists(path)) 
{ 
    File.Create(path); 
    using (StreamWriter sw = File.CreateText(path)) 
    { 
     sw.WriteLine("The first line!"); 
    } 

} 
else if (File.Exists(path)) 
    MessageBox.Show("File with this path already exists.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
6

Ну предположим, что каталог существует (как вы сказали), то у вас есть еще одна проблема

File.Create продолжает заперли файл, который он создает, вы не можете использовать StreamWriter таким образом.

Вместо этого вам нужно написать

using(FileStream strm = File.Create(path)) 
using(StreamWriter sw = new StreamWriter(strm)) 
    sw.WriteLine("The first line!"); 

однако все это на самом деле не нужно, если вам нужно создать файл с определенными опциями (see File.Create overload list), потому что StreamWriter создает сам файл, если он не существует.

// File.Create(path); 
using(StreamWriter sw = new StreamWriter(path)) 
    sw.WriteLine("Text"); 

... или все в одной строке

File.WriteAllText(path, "The first line"); 
0

Попробуйте это.

string path = @"C:\CSharpTestFolder"; 
if(Directory.Exixts(path) 
{ 
    File.AppendAllText(path+"\\Test.txt","The first line"); 
} 
else 
{ 
    Directory.CreateDirectory(path); 
    File.AppendAllText(path+"\\Test.txt","The first line"); 
} 

File.AppendAllText (путь, текст) метод создаст текстовый файл, если он не существует, добавьте текст и закройте файл. Если файл уже существует, он откроет файл и добавит текст к нему, а затем закроет файл. Исключение показывает, что каталог C: \ CSharpTestFolder не существует.