【发布时间】:2020-03-06 15:30:21
【问题描述】:
我知道这个网站上有很多类似的主题,但我认为我经历了大部分,仍然无法调试这段代码。我真的需要让这个工作。我是 C# 和编程的新手。 Tho,我在 Java 中做了同样的任务,但由于某种原因,我不能让它在这里工作。如果有人可以请投...
所以我有一些对象,我将它们保存在.txt 文件中,一行 = 一个对象的数据。该行的第一个数据是一个对象的Id,基本上是主键。现在我正在实现CRUD 操作,即更新。此编辑功能应该有助于该功能。
如果用户编辑某些选定的对象属性,则该更改需要反映在.txt 文件中。因此,我将遍历文件中的每个对象/行,将它们写入某个temp.txt 文件,一旦我点击与传递的对象o 具有相同Id 的对象,这意味着我需要编写@987654329 @到temp.txt。之后我需要将temp.txt重命名为原始文件并删除temp.txt。
我尝试了很多选项和组合,但都没有奏效。
我确实确保GetTxtPath 从我的项目中返回正确的绝对路径。
版本 1:
public static void edit(Transformable o, string fileName)
{
try
{
if (!File.Exists(FileUtils.GetTxtPath("temp.txt")))
{
File.Create(FileUtils.GetTxtPath("temp.txt"));
}
using (FileStream stream = File.OpenRead(FileUtils.GetTxtPath(fileName)))
using (FileStream writeStream = File.OpenWrite(FileUtils.GetTxtPath("temp.txt")))
{
StreamReader reader = new StreamReader(stream);
StreamWriter writer = new StreamWriter(writeStream);
String line;
while ((line = reader.ReadLine()) != null)
{
if (!line.Equals(""))
{
if (o.GetId() == getIdFromString(line))
{
writer.Write(o.WriteToFile());
}
else
{
writer.Write(line + "\n");
}
}
else
{
continue;
}
}
}
}
catch (FileNotFoundException e)
{
Console.WriteLine($"The file was not found: '{e}'");
}
catch (DirectoryNotFoundException e)
{
Console.WriteLine($"The directory was not found: '{e}'");
}
catch (IOException e)
{
Console.WriteLine($"The file could not be opened: '{e}'");
}
}
public static string GetTxtPath(string fileName)
{
var startDirectory =
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
var absPath = startDirectory + @"\data\" + fileName;
return absPath;
}
private static int getIdFromString(string line)
{
return Int32.Parse(line.Split('|')[0]);
}
版本 2:
public static void Edit(Transformable o, string fileName)
{
try
{
if (!File.Exists(FileUtils.GetTxtPath("temp.txt")))
{
File.Create(FileUtils.GetTxtPath("temp.txt"));
}
using (StreamReader reader = FileUtils.GetTxtReader(fileName))
using (StreamWriter writer = FileUtils.GetTxtWriter("temp.txt"))
{
String line;
while ((line = reader.ReadLine()) != null)
{
if (!line.Equals(""))
{
if (o.GetId() == getIdFromString(line))
{
writer.Write(o.WriteToFile());
}
else
{
writer.Write(line + "\n");
}
}
else
{
continue;
}
}
}
File.Move(FileUtils.GetTxtPath("temp.txt"), FileUtils.GetTxtPath(fileName));
File.Delete(FileUtils.GetTxtPath("temp.txt"));
//Here I tied many differenet options but nonthing worked
//Here is Java code which did the job of renaming and deleting
//------------------------------------------------------------
// File original = FileUtils.getFileForName(fileName);
// File backUpFile = new File("backUp");
// Files.move(original.toPath(), backUpFile.toPath(),
// StandardCopyOption.REPLACE_EXISTING);
// File temporary = FileUtils.getFileForName(temporaryFilePath);
// temporary.renameTo(original);
// backUpFile.delete();
// File original = FileUtils.getFileForName(path);
//--------------------------------------------------------
//public static File getFileForName(String name)
//{
// String dir = System.getProperty("user.dir");
// String sP = System.getProperty("file.separator");
// File dirData = new File(dir + sP + "src" + sP + "data");
// File file = new File(dirData.getAbsolutePath() + sP + name);
// return file;
//}
//---------------------------------------------------------------------
}
catch (FileNotFoundException e)
{
Console.WriteLine($"The file was not found: '{e}'");
}
catch (DirectoryNotFoundException e)
{
Console.WriteLine($"The directory was not found: '{e}'");
}
catch (IOException e)
{
Console.WriteLine($"The file could not be opened: '{e}'");
}
public static StreamReader GetTxtReader(string fileName)
{
var fileStream = new FileStream(GetTxtPath(fileName), FileMode.Open, FileAccess.Read);
return new StreamReader(fileStream, Encoding.UTF8);
}
public static StreamWriter GetTxtWriter(string fileName)
{
FileStream fileStream = new FileStream(GetTxtPath(fileName), FileMode.Append);
return new StreamWriter(fileStream, Encoding.UTF8);
}
【问题讨论】:
-
您说……”如果用户编辑某些选定对象的属性?……用户是如何做到的?将 crud 操作写入“临时”文件似乎很奇怪。我会想象原始 csv 文件中的所有数据都被读入某个集合类型,例如
List<T>。然后这个List<T>通过DataGridView.之类的UI显示给用户然后用户在UI上执行任何crud操作后,只需从List<T>重写整个csv文件。您的方法似乎使事情过于复杂。 -
但没有工作 - 指定究竟什么不起作用?可能因为没有释放资源(StreamReader/StreamWriter),所以无法删除和重命名文件。
-
删除文件然后尝试移动临时文件有很多潜在问题;破坏版本和元数据,如果
Move失败,则删除所有内容。咨询Safe stream updates。
标签: c# streamreader streamwriter