Створити файл, якщо файл не існує


76

Мені потрібно отримати свій код для читання, якщо файл не існує, створити else додати. Зараз воно читає, якщо воно існує, створіть і додайте. Ось код:

if (File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Я б це зробив?

if (! File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Редагувати:

string path = txtFilePath.Text;

if (!File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {
        foreach (var line in employeeList.Items)
        {
            sw.WriteLine(((Employee)line).FirstName);
            sw.WriteLine(((Employee)line).LastName);
            sw.WriteLine(((Employee)line).JobTitle);
        }
    }
}
else
{
    StreamWriter sw = File.AppendText(path);

    foreach (var line in employeeList.Items)
    {
        sw.WriteLine(((Employee)line).FirstName);
        sw.WriteLine(((Employee)line).LastName);
        sw.WriteLine(((Employee)line).JobTitle);
    }
    sw.Close();
}

}


1
File.AppendAllText - це робить саме те, що вам потрібно, в одному рядку коду ..
Майстер тіней вакцинує

@ShadowWizard Оскільки це позначено домашнє завдання, OP дійсно може бути спрямований на відображення умовної логіки.
Юк,

5
@Yuck - домашнє завдання, щоб винайти колесо? Гидота! ;)
Тіньовий майстер робить щеплення

Відповіді:


113

Ви можете просто зателефонувати

using (StreamWriter w = File.AppendText("log.txt"))

Він створить файл, якщо він не існує, і відкриє файл для додавання.

Редагувати:

Цього достатньо:

string path = txtFilePath.Text;               
using(StreamWriter sw = File.AppendText(path))
{
  foreach (var line in employeeList.Items)                 
  {                    
    Employee e = (Employee)line; // unbox once
    sw.WriteLine(e.FirstName);                     
    sw.WriteLine(e.LastName);                     
    sw.WriteLine(e.JobTitle); 
  }                
}     

Але якщо ви наполягаєте на першій перевірці, ви можете зробити щось подібне, але я не бачу сенсу.

string path = txtFilePath.Text;               


using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))                 
{                      
    foreach (var line in employeeList.Items)                     
    {                         
      sw.WriteLine(((Employee)line).FirstName);                         
      sw.WriteLine(((Employee)line).LastName);                         
      sw.WriteLine(((Employee)line).JobTitle);                     
    }                  
} 

Крім того, одне, на що слід звернути увагу у своєму коді, - це те, що ви робите багато непотрібного розпакування. Якщо вам доводиться використовувати просту (не загальну) колекцію, наприклад ArrayList, розпаковуйте об’єкт один раз і використовуйте посилання.

Однак я бажаю використовувати List<>для своїх колекцій:

public class EmployeeList : List<Employee>

18

або:

using FileStream fileStream = File.Open(path, FileMode.Append);
using StreamWriter file = new StreamWriter(fileStream);
// ...

1
У цьому випадку ви отримаєте IOException, оскільки fileStream все ще блокує файл, коли програма для запису потоку хоче записати на нього. Натомість передайте fileStream як аргумент конструктору StreamWriter.
засолений


6

Так, вам потрібно заперечити, File.Exists(path)якщо ви хочете перевірити, чи не існує файл .


-1 Перевірка наявності файлу перед відкриттям файлу є неправильним шаблоном. Це вводить умови перегонів. Дивіться інші відповіді та мій коментар до іншого питання .
ComFreek

0

Наприклад

    string rootPath = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
        rootPath += "MTN";
        if (!(File.Exists(rootPath)))
        {
            File.CreateText(rootPath);
        }

-1 Перевірка наявності файлу перед відкриттям файлу є неправильним шаблоном. Це вводить умови перегонів. Дивіться інші відповіді та мій коментар до іншого питання .
ComFreek

Мій шаблон, як містить у linq. Я маю на увазі, що це нормально. Іноді файли потребують авторизації, відкриття файлу має бути другим рішенням замість нашої відповіді.
Метін Аталай,

@MetinAtalay Вибачте, я не повністю розумію ваш коментар. Мене турбує те, що якщо файл створено - зовні - після if (!(File.Exists(...))), але раніше File.CreateText(...), то він буде перезаписаний.
ComFreek

0
private List<Url> AddURLToFile(Urls urls, Url url)
{
    string filePath = @"D:\test\file.json";
    urls.UrlList.Add(url);

    //if (!System.IO.File.Exists(filePath))
    //    using (System.IO.File.Delete(filePath));

    System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(urls.UrlList));

    //using (StreamWriter sw = (System.IO.File.Exists(filePath)) ? System.IO.File.AppendText(filePath) : System.IO.File.CreateText(filePath))
    //{
    //    sw.WriteLine(JsonConvert.SerializeObject(urls.UrlList));
    //}
    return urls.UrlList;
}

private List<Url> ReadURLToFile()
{
    //  string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"App_Data\file.json");
    string filePath = @"D:\test\file.json";

    List<Url> result = new List<Url>(); ;
    if (!System.IO.File.Exists(filePath))
        using (System.IO.File.CreateText(filePath)) ;



    using (StreamReader file = new StreamReader(filePath))
    {
        result = JsonConvert.DeserializeObject<List<Url>>(file.ReadToEnd());
        file.Close();
    }
    if (result == null)
        result = new List<Url>();

    return result;

}

Ласкаво просимо до SO. Будь ласка, надайте більше інформації, чому цей код може відповісти на запитання. Крім того, наведіть мінімальний відтворюваний приклад .
Матіас

0

Це також працює для мене

string path = TextFile + ".txt";

if (!File.Exists(HttpContext.Current.Server.MapPath(path)))
{
    File.Create(HttpContext.Current.Server.MapPath(path)).Close();
}
using (StreamWriter w = File.AppendText(HttpContext.Current.Server.MapPath(path)))
{
    w.WriteLine("{0}", "Hello World");
    w.Flush();
    w.Close();
}

0

Це дозволить додавати до файлу за допомогою StreamWriter

 using (StreamWriter stream = new StreamWriter("YourFilePath", true)) {...}

Це режим за замовчуванням, а не додавання до файлу та створення нового файлу.

using (StreamWriter stream = new StreamWriter("YourFilePath", false)){...}
                           or
using (StreamWriter stream = new StreamWriter("YourFilePath")){...}

У будь-якому випадку, якщо ви хочете перевірити, чи існує файл, а потім зробити інші речі, ви можете використовувати

using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))
            {...}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.