阅读和编辑文件内容

时间:2011-12-23 15:09:01

标签: c# string file-io

我有一个格式为:

的文件
AA
AA AA AA
AA AA AA AA AA AA
AA AA AA
file.txt
0

其中AA表示一位或两位数字(每个数字的长度不必为2),file.txt是文件的名称。我需要一个非常快的方法来获取文件名。另外,我需要用1替换最后的0。如果文件末尾没有0(可选),我需要在新行上追加1。这是我目前的代码:

StringBuilder sb = new StringBuilder("\r\n1");
string txt = File.ReadAllText(args[0]);
string[] lines = txt.Split('\n');
string name = lines[4];

if (lines.Length != 6) // Check if EOF is 0 or not.
    txt += sb.ToString();
else
    txt = txt.Substring(0, txt.Length - 1) + '1'; // Replace 0 with 1.

File.WriteAllText(args[0], txt);
Console.WriteLine(name);

但是,我想知道是否有更快的方法来执行此操作(无需在内存中加载文件)。我必须处理大量这样的文件,所以保存十分之一将非常有用。

3 个答案:

答案 0 :(得分:1)

如果filesize低于min(MemoryPageSize,FSBlockSize),通常是4K

,那么将完整文件加载到内存中很可能是您最快的选择

所以假设你有一个字符串中的文件内容,使用像

这样的东西
int n;
if (content.EndsWith("\r\n0")
{
  n=content.Length-3;
  content=content.Substring(0,n+2)+"1";
}
else
{
  n=content.Length;
  content=content+"\r\n1";
}

并将String写入文件。这将使您免于昂贵的Split()

我们继续如下文件名:

int p=content.LastIndexOf('\n',n);
String filename=content.Substring(p+1,n-p);

答案 1 :(得分:1)

var lines = new List<string>(File.ReadAllLines(args[0]));
string name = lines[4];

if (lines.Length != 6) // Check if EOF is 0 or not.
    lines.Add("1");
else
    lines[5] = "1";

File.WriteAllLines(args[0], lines);
Console.WriteLine(name);

答案 2 :(得分:1)

如果您正在寻找速度,那么您希望将FileStream.Read用于临时缓冲区。这是我扔在一起的东西,可能有助于指向一个稍微不同但更快的方向:

StringBuilder filename = new StringBuilder();
using (FileStream stream = new FileStream(args[0], FileMode.Open, FileAccess.Read))
{
    byte[] buffer = new byte[1];
    while (stream.Read(buffer, 0, 1) > 0)
    {
        char c = (char) buffer[0];
        if (char.IsLetter(c) || char.IsPunctuation(c))
            filename.Append(c);
    }
}