我有一个格式为:
的文件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);
但是,我想知道是否有更快的方法来执行此操作(无需在内存中加载文件)。我必须处理大量这样的文件,所以保存十分之一将非常有用。
答案 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);
}
}