同时对文本文件进行读写

时间:2020-12-25 21:37:05
小弟现在在做一个项目,项目组买了个传感器,它自带的软件能把数据直接存到txt里面。现在想在传感器存数据的同时,写个程序把txt里面的数据读出来。遇到了问题说,文件在另一个线程中被使用。

想请问大家有没有什么办法?谢谢了!

22 个解决方案

#1


用两个文件
或者读到内存中以后,关闭streamreader
再streamwriter

#2


引用楼主 yf315918 的回复:
小弟现在在做一个项目,项目组买了个传感器,它自带的软件能把数据直接存到txt里面。现在想在传感器存数据的同时,写个程序把txt里面的数据读出来。遇到了问题说,文件在另一个线程中被使用。

想请问大家有没有什么办法?谢谢了!


这么用可不是办法,以文件做为数据交换中介,看看传感器的sdk吧,应该不用从文件读的;

#3


我现在无法访问它建立的那个文件

#4


传感器没有SDK之类的东西啊。很晕。

#5


能不能获取它的进程让其睡眠一会呢?

#6


能不能写个程序先复制这个txt然后,读取这个复制的txt

#7


看看打开文件的方式,不要用独占打开,你试下

#8


用共享方式打开!

#9


对同一个文件,不能同时读写,这是一种保护。就是锁定。

如果你想读取那个txt文件,就必须在其写操作完成后再去读。

或者看看那个写的软件是否可以进行某些设定之类的。

#10


同一楼,可能是你没有关闭

#11


不知道传感器在写文件的时候有没有开读权限出来

只要有读权限,你就可以用下面的代码把文件装载到内存后慢慢处理,也不会影响到传感器的写操作
[C# Code]
Stream original = File.Open(Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            byte[] filebyte = new byte[original.Length];
            original.Seek(0, SeekOrigin.Begin);
            original.Read(filebyte, 0, filebyte.Length);
            original.Close();
            original.Dispose();
 using (MemoryStream dbf = new MemoryStream(filebyte))
            {
}
[/C# Code]

#12


两个线程肯定不能同时使用独占资源的,找一个中间载体吧

#13


引用 11 楼 lokiice 的回复:
不知道传感器在写文件的时候有没有开读权限出来

只要有读权限,你就可以用下面的代码把文件装载到内存后慢慢处理,也不会影响到传感器的写操作
[C# Code]
Stream original = File.Open(Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] filebyte = new byte[o……

11楼的想法不错

#14


建议用数据库,

#15


高速去读写txt文件是不现实的

#16


好像很矛盾啊,他都没写完,你读的是啥啊?  他一边写,你一边读?  你能保证你读到的是完整的数据吗?
他里面一直在变化的啊


还有就是最关键的:
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?

#17


遇到类似问题,求解啊

#18


用数据库就完全可以了

数据库是可以支持你的这个要求的

简单问题不要用复杂方式实现

你是客户

让他们提供数据库的形式

要是放放数据库一个查询就实现了

#19


同时对文本文件进行读写

其实按说,文件写的时候应该是可读的。FileShare你试试,不过这个比较耗内存的,想对于普通的Stream。

例子:(没编译,复制到自己那试试)

 FileStream fsw = new FileStream("C:\\shareFile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

       
             
            Thread writeWorker = new Thread((ThreadStart)delegate 
                {
                    while (true)
                    {
                        fsw.Seek(0,SeekOrigin.Begin);
                        byte[] writeBuffer = Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString("hh:mm:ss")+Environment.NewLine);
                        fsw.Write(writeBuffer, 0, writeBuffer.Length);
                        fsw.Flush();
                        Thread.Sleep(1000);
                    }
                });
           
            Thread readWorker = new Thread((ThreadStart)delegate 
                {
                    while(true)
                    {   
                        FileStream fs = new FileStream("c:\\shareFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                        byte[] readBuffer = new byte[fs.Length];
                        fs.Read(readBuffer,0,readBuffer.Length);
                        Console.WriteLine(Encoding.UTF8.GetString(readBuffer));
                        Thread.Sleep(1000);
                    }
                });
            writeWorker.Start();
            readWorker.Start();
            Console.ReadLine();

#20


引用 19 楼 sunzongbao2007 的回复:
其实按说,文件写的时候应该是可读的。FileShare你试试,不过这个比较耗内存的,想对于普通的Stream。

例子:(没编译,复制到自己那试试)
C# code

 FileStream fsw = new FileStream("C:\\shareFile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

       
   ……


加上writeWorker 跟 readWorker的Close();我手残了,忘了写。

#21


to:yf315918
不要想尽办法去解决读txt文件的问题。
传感器数据就那么几种数据传输的方法
串口,GPRS(通过Socket)
你去了解一下,他们是使用哪种方式传输的,然后自己去实现你需要的功能。
然后这些数据都有自定义的格式,放到数据库中需要自己解下

#22


数据读的时候读到内存,写的时候写到文件,只要还是在于业务逻辑上的设计,什么时候读,什么时候写

#1


用两个文件
或者读到内存中以后,关闭streamreader
再streamwriter

#2


引用楼主 yf315918 的回复:
小弟现在在做一个项目,项目组买了个传感器,它自带的软件能把数据直接存到txt里面。现在想在传感器存数据的同时,写个程序把txt里面的数据读出来。遇到了问题说,文件在另一个线程中被使用。

想请问大家有没有什么办法?谢谢了!


这么用可不是办法,以文件做为数据交换中介,看看传感器的sdk吧,应该不用从文件读的;

#3


我现在无法访问它建立的那个文件

#4


传感器没有SDK之类的东西啊。很晕。

#5


能不能获取它的进程让其睡眠一会呢?

#6


能不能写个程序先复制这个txt然后,读取这个复制的txt

#7


看看打开文件的方式,不要用独占打开,你试下

#8


用共享方式打开!

#9


对同一个文件,不能同时读写,这是一种保护。就是锁定。

如果你想读取那个txt文件,就必须在其写操作完成后再去读。

或者看看那个写的软件是否可以进行某些设定之类的。

#10


同一楼,可能是你没有关闭

#11


不知道传感器在写文件的时候有没有开读权限出来

只要有读权限,你就可以用下面的代码把文件装载到内存后慢慢处理,也不会影响到传感器的写操作
[C# Code]
Stream original = File.Open(Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            byte[] filebyte = new byte[original.Length];
            original.Seek(0, SeekOrigin.Begin);
            original.Read(filebyte, 0, filebyte.Length);
            original.Close();
            original.Dispose();
 using (MemoryStream dbf = new MemoryStream(filebyte))
            {
}
[/C# Code]

#12


两个线程肯定不能同时使用独占资源的,找一个中间载体吧

#13


引用 11 楼 lokiice 的回复:
不知道传感器在写文件的时候有没有开读权限出来

只要有读权限,你就可以用下面的代码把文件装载到内存后慢慢处理,也不会影响到传感器的写操作
[C# Code]
Stream original = File.Open(Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] filebyte = new byte[o……

11楼的想法不错

#14


建议用数据库,

#15


高速去读写txt文件是不现实的

#16


好像很矛盾啊,他都没写完,你读的是啥啊?  他一边写,你一边读?  你能保证你读到的是完整的数据吗?
他里面一直在变化的啊


还有就是最关键的:
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?
兄弟我没分了,咋还得有分才能发帖子呢?   能给我点不?

#17


遇到类似问题,求解啊

#18


用数据库就完全可以了

数据库是可以支持你的这个要求的

简单问题不要用复杂方式实现

你是客户

让他们提供数据库的形式

要是放放数据库一个查询就实现了

#19


同时对文本文件进行读写

其实按说,文件写的时候应该是可读的。FileShare你试试,不过这个比较耗内存的,想对于普通的Stream。

例子:(没编译,复制到自己那试试)

 FileStream fsw = new FileStream("C:\\shareFile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

       
             
            Thread writeWorker = new Thread((ThreadStart)delegate 
                {
                    while (true)
                    {
                        fsw.Seek(0,SeekOrigin.Begin);
                        byte[] writeBuffer = Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString("hh:mm:ss")+Environment.NewLine);
                        fsw.Write(writeBuffer, 0, writeBuffer.Length);
                        fsw.Flush();
                        Thread.Sleep(1000);
                    }
                });
           
            Thread readWorker = new Thread((ThreadStart)delegate 
                {
                    while(true)
                    {   
                        FileStream fs = new FileStream("c:\\shareFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                        byte[] readBuffer = new byte[fs.Length];
                        fs.Read(readBuffer,0,readBuffer.Length);
                        Console.WriteLine(Encoding.UTF8.GetString(readBuffer));
                        Thread.Sleep(1000);
                    }
                });
            writeWorker.Start();
            readWorker.Start();
            Console.ReadLine();

#20


引用 19 楼 sunzongbao2007 的回复:
其实按说,文件写的时候应该是可读的。FileShare你试试,不过这个比较耗内存的,想对于普通的Stream。

例子:(没编译,复制到自己那试试)
C# code

 FileStream fsw = new FileStream("C:\\shareFile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

       
   ……


加上writeWorker 跟 readWorker的Close();我手残了,忘了写。

#21


to:yf315918
不要想尽办法去解决读txt文件的问题。
传感器数据就那么几种数据传输的方法
串口,GPRS(通过Socket)
你去了解一下,他们是使用哪种方式传输的,然后自己去实现你需要的功能。
然后这些数据都有自定义的格式,放到数据库中需要自己解下

#22


数据读的时候读到内存,写的时候写到文件,只要还是在于业务逻辑上的设计,什么时候读,什么时候写