簡體   English   中英

從文件讀取並寫入 C# 中的臨時.txt 文件?

[英]Reading from file and writing to a temporary .txt file in C#?

我知道這個網站上有很多類似的主題,但我認為我經歷了大部分,仍然無法調試這段代碼。 我真的需要讓這個工作。 我是 C# 和編程的新手。 Tho,我在 Java 中做了同樣的任務,但由於某種原因,我不能讓它在這里工作。 如果有人可以請投...

所以我有一些對象,我保存在.txt文件中,一行 = 一個 object 的數據。 該行的第一個數據是 object 的Id ,基本上是主鍵。 現在我正在實現CRUD操作,即更新。 此編輯 function 應該有助於該功能。

如果用戶編輯某些選定的 object 屬性,則該更改需要反映在.txt文件中。 So, I will go through every object/line in the file, write them to some temp.txt file, once I hit object which has same Id as the passed object o , that means I need to write that edited object to 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);
}
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 ...

}

File.OpenWrite方法打開現有文件或創建新文件以進行寫入。 因此無需手動檢查和創建文件。

您已經非常正確地將FileStreams包裝在 using 語句中。 但是, StreamReaderStreamWriter也必須在使用后釋放。

我重命名了一些方法,賦予它們符合 C# 中命名規則的名稱: EditGetIdToWriteableString

不需要帶有continue語句的else分支。

最后,只需使用File.DeleteFile.Move方法。

注意: int.Parse方法可以拋出同樣需要處理的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM