当前位置: 首页 > 编程语言 > C#

c#连续读取文件分享

时间:2023-04-11 02:21:35 C#

c#连续读取文件我想像GNUtail"-f"param一样连续读取文件。我需要它来实时读取日志文件。这样做的正确方法是什么?您想要以二进制模式打开FileStream。定期查找文件末尾减去1024字节(或其他字节),然后读取到末尾并输出。这就是tail-f的工作原理。您的问题的答案:二进制文件,因为如果您将文件作为文本读取,则很难随机访问该文件。您必须自己进行二进制到文本的转换,但这并不困难。(见下文)1024字节,因为它是一个方便的数字,可以处理10或15行文本。通常。这是一个打开文件、读取最后1024个字节并将其转换为文本的示例:staticvoidReadTail(stringfilename){using(FileStreamfs=File.Open(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)){//从文件末尾开始寻找1024个字节fs.Seek(-1024,SeekOrigin.End);//读取1024字节byte[]bytes=newbyte[1024];fs.Read(字节,0,1024);//将字节转换为字符串strings=Encoding.Default.GetString(bytes);//或字符串s=Encoding.UTF8.GetString(bytes);//并输出到控制台Console.WriteLine(s);请注意,您必须使用FileShare.ReadWrite打开,因为您正在尝试读取当前打开以供另一个进程写入的文件。另请注意,我使用的是Encoding.Default,它是美国/英语和大多数西欧语言的8位字符编码。如果文件是用另一种编码(如UTF-8或另一种Unicode编码)编写的,则字节可能无法正确转换为字符。如果您认为这将是一个问题,您将不得不通过识别编码来处理它。搜索StackOverflow以获取有关确定文件文本编码的信息。如果您想定期执行此操作(例如,每15秒),您可以设置一个计时器,按需调用ReadTail方法。您可以通过在程序开始时仅打开一次文件来稍微优化一下。由你决定(由你决定。使用FileSystemWatcher的更自然的方法:varwh=newAutoResetEvent(false);varfsw=newFileSystemWatcher(".");fsw.Filter="file-to-read";fsw.EnableRaisingEvents=true;fsw.Changed+=(s,e)=>wh.Set();varfs=newFileStream("file-to-read",FileMode.Open,FileAccess.Read,FileShare.ReadWrite);使用(varsr=newStreamReader(fs)){vars="";while(true){s=sr.ReadLine();if(s!=null)Console.WriteLine(s);elsewh.WaitOne(1000);wh.Close();这里主读周期停止等待输入数据,FileSystemWatcher只是用来唤醒主读周期。要持续监听文件结束,只需要记住前面的长度即可文件。publicstaticvoidMonitorTailOfFile(stringfilePath){varinitialFileSize=newFileInfo(filePath).Length;varlastReadLength=initialFileSize-1024;如果(lastReadLengthlastReadLength){使用(varfs=newFileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)){fs.Seek(lastReadLength,SeekOrigin.Begin);varbuffer=newbyte[1024];while(true){varbytesRead=fs.Read(buffer,0,buffer.Length);lastReadLength+=bytesRead;如果(bytesRead==0)中断;vartext=ASCIIEncoding.ASCII.GetString(buffer,0,bytesRead);控制台。写入(文本);}}}}赶上{}Thread.Sleep(1000);我不得不使用ASCIIEncoding,因为这段代码不够智能,无法在缓冲区边界上适应UTF8的可变字符长度。注意:您可以将Thread.Sleep部分更改为不同的时间,并将其与filewatcher和阻塞模式相关联-Monitor.Enter/Wait/Pulse。对我来说,一个计时器就足够了,如果文件没有改变,它最多每秒检查一次文件长度。您可以使用FileSystemWatcher类,它可以发送文件系统上发生的不同事件的通知,例如更改的文件。这是我的解决方案staticIEnumerableTailFrom(stringfile){using(varreader=File.OpenText(file)){while(true){if(reader.BaseStream.Length所以,在你的代码中你可以做e){if(folderBrowserDialog.ShowDialog()==DialogResult.OK){path=folderBrowserDialog.SelectedPath;fileSystemWatcher.Path=path;string[]str=Directory.GetFiles(path);字符串行;fs=newFileStream(str[0],FileMode.Open,FileAccess.Read,FileShare.ReadWrite);tr=newStreamReader(fs);while((line=tr.ReadLine())!=null){listBox.Items.Add(line);}}}privatevoidfileSystemWatcher_Changed(objectsender,FileSystemEventArgse){stringline;line=tr.ReadLine();listBox.Items.Add(line);}如果你只是在寻找一个工具来做到这一点,采取一个看上面的裸尾免费版是C#学习教程:c#连续阅读文件分享所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: