簡體   English   中英

是否可以在C#中讀取和寫入相同的文本文件

[英]Is it possible to read from and write to the same text file in C#

這是情況。 我有超過1500個SQL(文本)文件,其中包含“在CREATE TABLE語句之后向某些用戶授予對某些表的某些特權”。我需要將它們從原始文件中刪除,並將GRANT語句放入其自己的文件中。有時,Grants在同一行上,有時又分成多行,例如:

  GRANT SELECT ON XYZ.TABLE1 TO MYROLE1 ;
  GRANT
  SELECT ON XYZ.TABLE1 TO MYROLE2 ;
  GRANT
  DELETE,
  INSERT,
  SELECT,
  UPDATE ON XYZ.TABLE1 TO MYROLE3;

我將遍歷文件,直到到達GRANT,然后構建一個字符串,其中包含從GRANT到分號的文本,然后將其寫到另一個文件中。 我有一個用Delphi(帕斯卡)編寫的應用程序,這一部分效果很好。 我想做的是在閱讀並處理了我想要的行之后,我想從原始文本文件中刪除該行。 我不能在Delphi中做到這一點。 唯一的解決方案是逐行讀取文件,然后將文件寫回到另一個文件(不包括我不需要的行),同時還將GRANTS寫入另一個文件。 然后刪除原始文件並重命名新文件。 方式處理和風險太大。

我看過在C#中使用StreamReader和StreamWriter,但情況似乎與Delphi類似。 我可以讀或可以寫,但是不能同時對同一個文件進行操作。

我將不勝感激任何建議。

謝謝

如果您認為在生成新的臨時文件而沒有不需要的行並替換原始行的過程中存在“過多的處理和風險”,那么請考慮您希望實現的替代方案。

Line 1
    Line 2
    Delete this line
+-->Line 4
|   Line 5
|
+- Read position marker after reading line to be deleted

如果您在讀取時立即刪除該行,則在刪除第3行之后,必須將后面的行移回到左側的“空白處”。 為了確保您下次閱讀“第4行”,您必須回溯您的讀取位置標記。 回溯的正確金額是多少? 可變長度的 “行”,或已刪除行的字符數

您認為“風險”選項實際上是安全的選項!


如果要在處理時刪除,則可以使用給您留下深刻印象的抽象。 但是,您失去了流處理的好處,並且一開始並沒有真正消除您擔心的任何風險。

例如,將整個文件加載到字符串列表中; 例如數組,向量或TStringList (在Delphi中)。 遍歷列表並刪除不需要的項目。 最后將列表保存回文件。

這種方法具有以下缺點:

  • 潛在的高內存開銷,因為您加載了整個文件而不是流的小緩沖區。
  • 您將面臨中間流程故障而無法恢復的風險,因為您的工作是全有還是全無
  • 您必須處理選擇保存字符串列表的特定容器的細微差別。
    • 在某些情況下(例如TStringList ),您可能仍需要以與先前描述類似的方式回溯位置標記。
    • 對於數組,每次刪除性能損失很大的東西時,都必須將所有行復制回1個位置。 (盡管TStringList對您隱藏了,但情況相同)。
    • 每當您修改列表時,某些容器的迭代器都會失效。 這意味着無論如何您都必須復制到沒有“已刪除的行”的新列表。 更多的內存開銷。

總之,采取安全的選擇 使用單獨的讀寫流; 寫入臨時文件,完成后重命名。 它將節省您的頭痛。

暫無
暫無

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

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