你可以使用streamreader来读取普通文本文件,然后在保存当前位置后再读取流读取器,然后再次打开streamreader并开始读取该poision吗?
如果不是我可以使用什么来完成相同的情况而不锁定文件?
这样的事情:
var fs = File.Open(@"C:\testfile.txt", FileMode.Open, FileAccess.Read);
var sr = new StreamReader(fs);
Debug.WriteLine(sr.ReadLine());//Prints:firstline
var pos = fs.Position;
while (!sr.EndOfStream)
{
Debug.WriteLine(sr.ReadLine());
}
fs.Seek(pos, SeekOrigin.Begin);
Debug.WriteLine(sr.ReadLine());//Prints Nothing, i expect it to print SecondLine.
Run Code Online (Sandbox Code Playgroud)
@lasseespeholt
这是我试过的代码
var position = -1;
StreamReaderSE sr = new StreamReaderSE(@"c:\testfile.txt");
Debug.WriteLine(sr.ReadLine());
position = sr.BytesRead;
Debug.WriteLine(sr.ReadLine());
Debug.WriteLine(sr.ReadLine());
Debug.WriteLine(sr.ReadLine());
Debug.WriteLine(sr.ReadLine());
Debug.WriteLine("Wait");
sr.BaseStream.Seek(position, SeekOrigin.Begin);
Debug.WriteLine(sr.ReadLine());
Run Code Online (Sandbox Code Playgroud) 一个例子(可能不是现实生活,但要说明我的观点):
public void StreamInfo(StreamReader p)
{
string info = string.Format(
"The supplied streamreaer read : {0}\n at line {1}",
p.ReadLine(),
p.GetLinePosition()-1);
}
Run Code Online (Sandbox Code Playgroud)
GetLinePosition
这是streamreader的虚构扩展方法.这可能吗?
当然,我可以自己计算,但这不是问题.
我只想阅读一个大型CSV文件并将Stream位置保存在列表中.之后我必须从列表中读取位置并将Streamreader的位置设置为该char并读取一行!但在我读完第一行并返回streamposition后
StreamReader r = new StreamReader("test.csv");
r.readLine();
Console.WriteLine(r.BaseStream.Position);
Run Code Online (Sandbox Code Playgroud)
我得到"177",这是文件中的总字符数!(这只是一个简短的示例文件)我没有在这里发现任何类似的东西,它帮助了我!
为什么?
完全方法:
private void readfile(object filename2)
{
string filename = (string)filename2;
StreamReader r = new StreamReader(filename);
string _top = r.ReadLine();
top = new Eintrag(_top.Split(';')[0], _top.Split(';')[1], _top.Split(';')[2]);
int siteindex = 0, index = 0;
string line;
sitepos.Add(r.BaseStream.Position); //sitepos is the a List<int>
while(true)
{
line = r.ReadLine();
index++;
if(!string.IsNullOrEmpty(line))
{
if (index > seitenlaenge)
{
siteindex++;
index = 1;
sitepos.Add(r.BaseStream.Position);
Console.WriteLine(line);
Console.WriteLine(r.BaseStream.Position.ToString());
}
}
else break;
maxsites = siteindex;
}
reading = …
Run Code Online (Sandbox Code Playgroud)