#c# #.net #file
#c# #.net #файл
Вопрос:
Я работаю над консольным приложением c #. Я сохраняю некоторые данные в текстовый файл. При каждом запуске программы данные сохраняются в этот файл без перезаписи. Теперь я хочу сохранять данные в новый файл каждый раз, когда отправляю запрос / запускаю новую программу.
var result = XmlDecode(soapResult);
XDocument doc = XDocument.Parse(result);
XmlReader read = doc.CreateReader();
DataSet ds = new DataSet();
ds.ReadXml(read);
read.Close();
if (ds.Tables.Count > 0 amp;amp; ds.Tables["Reply"] != null amp;amp; ds.Tables["Reply"].Rows.Count > 0)
{
string refNo = string.Empty;
string uniqueKey = string.Empty;
string meterNo = string.Empty;
List<string> ls = new List<string>();
if (ds.Tables["Reply"].Rows[0][0].ToString().ToUpper() == "OK")
{
if (ds.Tables["Names"] != null amp;amp; ds.Tables["Names"].Rows.Count > 0)
{
uniqueKey = ds.Tables["Names"].Rows[0]["name"].ToString();
}
if (ds.Tables["NameType"] != null amp;amp; ds.Tables["NameType"].Rows.Count > 0)
{
refNo = ds.Tables["NameType"].Rows[0]["name"].ToString();
}
if (ds.Tables["Meter"] != null amp;amp; ds.Tables["Meter"].Rows.Count > 0)
{
if (ds.Tables["Meter"].Columns.Contains("mRID"))
{
meterNo = ds.Tables["Meter"].Rows[0]["mRID"].ToString();
processedRec ;
}
}
}
log = uniqueKey " | " refNo " | " meterNo " | " Environment.NewLine;
ls.Add(log);
}
File.AppendAllText(filePath, log);
Как я могу создавать новый файл каждый раз?
Любая помощь будет высоко оценена.
Комментарии:
1. Измените значение
filePath
.2. итак, удалите файл, если он существует, и сохраните файл?#
3. @BugFinder нет, я не хочу удалять файл
4. Вы не сказали ничего, кроме того, что хотите новый файл.. откуда нам знать
5. Используйте
File.CreateText
вместоFile.AppendAllText
Ответ №1:
Создайте уникальный путь к файлу. Что-то вроде этого:
var filePath =$"{folderPath}txtFile_{Guid.NewGuid()}";
Это сделает файл всегда уникальным. Идентификатор guid также может быть заменен чем-то более значимым, например, меткой времени Unix.
Ответ №2:
Каждый раз создавайте пользовательское имя файла и используйте File.WriteAllText
(который создаст новый файл, запишет содержимое в файл, а затем закроет файл. Если целевой файл уже существует, он перезаписывается.) вместо File.AppendAllText
В вашем случае filePath
он должен быть динамическим, который может быть сконструирован следующим образом:
string basePath = ""; // this should be path to your directory in which you wanted to create the output files
string extension = ".xml";
string fileName = String.Format("{0}{1}{2}","MyFile",DateTime.Now.ToString("ddMMyy_hhmmss"),extension );
string filePath = Path.Combine(basePath,fileName);
В приведенном выше фрагменте DateTime.Now.ToString("ddMMyy_hhmmss")
будет текущее время (во время выполнения кода), которое будет отличаться при каждом выполнении, поэтому имя файла будет отличаться при каждом запуске. И на некоторых более поздних этапах вы можете искать / группировать файлы на основе этого общего шаблона.
Еще одна вещь:
В вашем коде вы использовали переменную List<string> ls
, которая заполняется всеми журналами, и вы записываете содержимое log
в файл, который содержит только последнюю запись. Итак, инструкция для записи содержимого должна быть:
File.WriteAllText(filePath, String.Join("n",log));
или даже просто
File.WriteAllLines(filePath, log);
Комментарии:
1. Я попробовал ваш код и сделал следующее
File.WriteAllText(filePath, log);
. Журнал создается с отметкой даты и времени, но включает только последнюю запись.2. @Faisal: Да,
log
у источника будет только последнее значение, вы ввели значения в вызываемый списокls
, вместо этого используйте его, дляlog
которого будет содержать все журналы3. ранее при использовании
File.AppendAllText
все журналы были в файле, а не в последнем4. Как вы перебираете строки таблицы или узлы xml?
Ответ №3:
просто сделайте свой путь к файлу уникальным, например, с помощью тиков
var filePath = $"app-log-{DateTime.Now.Ticks:X}.log";