在C#中读取文件并写入临时.txt文件?

在C#中读取文件并写入临时.txt文件?,c#,streamreader,streamwriter,C#,Streamreader,Streamwriter,我知道这个网站上有很多类似的主题,但我想我已经浏览了其中的大部分,仍然无法调试这段代码。我真的需要让它工作起来。我是C#和编程的新手。Tho,我用Java做了同样的作业,但由于某种原因,我不能在这里工作。如果有人能帮忙 所以我有一些对象,我保存在.txt文件中,一行=一个对象的数据。行的第一个数据是对象的Id,基本上是主键。现在我正在实现CRUD操作,即更新。此编辑功能应该有助于实现该功能 如果用户编辑某些选定对象属性,则该更改需要反映在.txt文件中。因此,我将遍历文件中的每一个对象/行,将它

我知道这个网站上有很多类似的主题,但我想我已经浏览了其中的大部分,仍然无法调试这段代码。我真的需要让它工作起来。我是C#和编程的新手。Tho,我用Java做了同样的作业,但由于某种原因,我不能在这里工作。如果有人能帮忙

所以我有一些对象,我保存在
.txt
文件中,一行=一个对象的数据。行的第一个数据是对象的
Id
,基本上是主键。现在我正在实现
CRUD
操作,即更新。此编辑功能应该有助于实现该功能

如果用户编辑某些选定对象属性,则该更改需要反映在
.txt
文件中。因此,我将遍历文件中的每一个对象/行,将它们写入一些
temp.txt
文件,一旦我点击了与传递的对象
o
具有相同
Id
的对象,这意味着我需要将
编辑过的对象
写入
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);
}
File.OpenWrite
方法打开现有文件或创建新文件进行写入。因此,无需手动检查和创建文件

您已经将
FileStreams
包装在一个using语句中,非常正确。但是,
StreamReader
StreamWriter
也必须在使用后释放

我重命名了一些方法,给它们起了符合C中命名规则的名字:
Edit
GetId
ToWriteableString

不需要带有
continue
语句的
else
分支

最后,只需使用
File.Delete
File.Move
方法即可


注意:
int.Parse
方法可以抛出也需要处理的异常。

您可以声明…“如果用户编辑某些选定的对象属性?”…用户是如何做到这一点的?将crud操作写入“临时”文件似乎有些奇怪。我会想象原始csv文件中的所有数据都被读入某种集合类型,如
列表
。然后,此
列表
通过一些UI(如
DataGridView)显示给用户。
然后,用户在UI上执行任何crud操作后,只需从
列表
重新写入整个csv文件即可。你的方法似乎过于复杂了。但是没有一个有效-具体说明什么不起作用?可能是因为您没有释放资源(StreamReader/StreamWriter),所以无法删除和重命名文件。删除文件然后尝试移动临时文件有许多潜在问题;中断版本和元数据,如果
移动失败,则删除所有内容。咨询
public static void Edit(Transformable o, string fileName)
{
    try
    {
        string tempName = "temp.txt"; // create here correct path

        using (var readStream = File.OpenRead(fileName))
        using (var writeStream = File.OpenWrite(tempName))
        using (var reader = new StreamReader(readStream))
        using (var writer = new StreamWriter(writeStream))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                if (!line.Equals(""))
                {
                    if (o.GetId() == GetId(line))
                    {
                        writer.WriteLine(o.ToWriteableString());
                    }
                    else
                    {
                        writer.WriteLine(line);
                    }
                }
            }
        }

        File.Delete(fileName);
        File.Move(tempName, fileName);
    }
    catch ...

}