请教各位大侠。。我用file.readalllines()方法读文件,如何共享式读取呢?

时间:2022-07-20 13:26:41
如题。
我用file.readalllines()方法读csv文件,如果此文件正在用excel方式打开的话,程序就报错了。。。
我只想读,不写。。。
可以用共享的方式么?

实在不行,我就换file.open()的方式了,这样就可以选择共享读文件了。。。
可是我想用file.readalllines(),一行一行的读阿

各位大侠都是怎么处理的?

22 个解决方案

#1



        Dim fs As FileStream = File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        Dim sr As StreamReader = New StreamReader(fs)
        While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
        End While
        sr.Close()
        fs.Close()
        '除使用ReadLine之外,也可使用ReadToEnd()方法來讀取全部內容

#2


哈,谢谢楼上大侠。。
我试一下上来报告哈

#3


framework2.0...2005

Dim fs As IO.FileStream之后,没有File.Open()这个方法啊?

只有FileOpen()方法,可是写成下面这样的话,报错说不能写成式子,

Dim fs As FileStream = FileOpen("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

单独打开文件,是可以的呀
FileOpen("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

这样子的话,怎么办呢?

#4


使用My.Computer.FileSystem 对象的FileOpen方法试试看。

#5


Imports System.IO

#6


File類的完整命名空間是System.IO.File

#7



谢谢楼上大侠继续回答^@^

答楼上大侠,我试过了,正在用excel格式打开的csv文件,还是读不进来。还是报错。。。

Dim strsplit() As String
Dim fs As IO.FileStream = File.Open(.FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim sr As IO.StreamReader = New IO.StreamReader(fs)
Dim lines As String = sr.ReadLine()
strsplit = Split(sr.ReadLine(), ",")
Dim i As Integer
For i = 0 To UBound(strsplit) - 1
CheckedListBox1.Items.Add(strsplit(i), False)   '我只是读了第一行的标题,绑到checklistbox上。
Next i
sr.Close()
fs.Close()

#8


File.Open(.FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
---------------------------------------------
FileShare.ReadWrite


Dim lines As String = sr.ReadLine() 
strsplit = Split(sr.ReadLine(), ",") 
----------------------------------
每調用一次ReadLine,就會讀一行文本出來,你這裡的讀了兩次,但lines沒再使用了,難道這是你的本意?


另外,如果你是要使用ReadLine一行行讀出全部文本,通常應該按如果方式來執行:

       While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
       End While

#9


谢谢楼上大侠这么耐心。。

1。FileShare.ReadWrite 改成这个之后,可以读了!嗬嗬。谢谢谢谢/
2。关于第二个问题,我原本用的是file.readalllines(),这个方法。
   这样当行数也不确定的情况下,我可以分别对第1行,第2行、以及3行以后的数据进行分类操作。。。

'Dim lines As String() = System.IO.File.ReadAllLines(.FileName, System.Text.Encoding.Default)
'Dim strsplit() As String
'For n As Integer = 0 To 1                '暂时读2行的。。
'    strsplit = lines(n).Split(",")
'    Dim i As Integer
'    For i = 0 To UBound(strsplit)
'        If n = 0 Then
'            CheckedListBox1.Items.Add(strsplit(i), False)
'        Else : n = 1
'            If strsplit(i).ToString = "○" Then
'                'チェック状態を変更する
'                CheckedListBox1.SetItemCheckState(i, CheckState.Checked)
'            End If
'        End If

'    Next i
'Next n

问题:
如果用
       While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
       End While
这个的话,我怎么区别第一行,第二行呢?

我是新手。。如果事态笨的问题,还请包涵哦。。。。 ^\^

#10



呵呵,
上面的问题解决啦。。。用的for,没用while....
谢谢大侠哈。

不过还有一个小问题
如何取得读入的文件的行数呢?

#11



       Dim LineCnt As Integer=0
       While Not sr.EndOfStream 
            Dim line As String = sr.ReadLine() 
            LineCnt+=1
            '進行操作 
        End While 
       '至此,LineCnt就是讀出的總行數了

#12


做VB的啊  我是做C#的给你不一样

#13


谢谢boblaw大侠。。^@^

可是,为什么是FileShare.ReadWrite 
而不是FileShare.Read呢?

这个事件中我只要读,不要写,为什么我设定成FileShare.Read,文件打开的情况下,程序不能读文件呢?

设定成FileShare.ReadWrite ,文件打开的情况下,程序就可以读文件呢?

#14


我找到答案了。。。
 そして3番目のFileShareパラメータだが、これは対象のファイルに対する共有方法指定するもので、これには、「FileShare.None」「FileShare.Read」「FileShare.Write」「FileShare.ReadWrite」「FileShare.Delete」「FileShare.Inheritable」が指定できる。StreamReaderクラスはどうやら、ファイル・オープン時に「FileShare.Read」しか与えていないようなので、ここで「FileShare.ReadWrite」を指定すれば、すでに書き込みでオープン中のファイルをオープンすることができる。

可是觉得,FileShare.Read不就没用了么?

#15


FileShare.ReadWrite 是允許其他程序讀寫,而不是當前程序

#16


引用 15 楼 boblaw 的回复:
FileShare.ReadWrite 是允許其他程序讀寫,而不是當前程序


boblaw 你真厉害,我想拜你为师啦。^@^
不过  ·允許其他程序讀寫·      说得我糊涂了。。。

我验证了一下
条件
1。设定为FileShare.Read
2。csv文件改成'读专用'(汗,不知道该怎么说了)
结果
文件打开的情况下,程序可以读文件。

条件
1。设定为FileShare.Read
2。csv文件正常读写都可。
结果
文件打开的情况下,程序不可以access文件。


也就是说
FileShare.ReadWrite 是打开拥有写权利的文件的。
FileShare.Read 是打开'读专用'的文件的。

对么?
如果设定为·FileShare.ReadWrite·的话,可以同时读文件,对文件没有危险的吧?
如果其他人正在写文件的时候,这边也可以只读进来的话。。。
一般程序是不是不这么设计的呀?

我好罗索。。。辛苦大侠

#17


不知道是什么原因,我看不太懂上面所提到的“sr”.

我使用VB2005做了一个测试,和楼主的代码有些不大一样,我的是这样的:


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim path As String = "D:\aa.csv"

        If System.IO.File.Exists(path) Then
            Dim sb As New System.Text.StringBuilder
            Using sr As IO.FileStream = System.IO.File.Open(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
                Dim array As Byte() = New Byte(1024) {}
                Dim length As Integer = 0
                Do
                    length = sr.Read(array, 0, 1024)
                    Dim str As String = System.Text.Encoding.GetEncoding("gb2312").GetString(array, 0, length)
                    sb.Append(str)
                Loop While (length = 1024)
                Dim lines As String() = sb.ToString.Split(New String() {ChrW(13) & ChrW(10)}, StringSplitOptions.RemoveEmptyEntries)
            End Using
        End If

    End Sub

#18


File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
---------------------------------------------------------------
如上代碼,FileAccess是表示當前程序需要的訪問權限,而FileShare是表示允許其他程序的訪問權限.

你用Excel打開csv文件時,Excel肯定具有讀寫權限.這時候你的程序打開這個csv文件,如果你設置FileShare.Read(也就是衹允許其他文件衹讀)是不行的,因為Excel已經有讀寫權限了,你衹允許衹讀是不行的,設為ReadWrite剛好符合.

#19


to hbxtlhx :
我用的也是vb2005.下面的代碼是有測試過OK的

      Dim fs As FileStream = File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        Dim sr As StreamReader = New StreamReader(fs)
        While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
        End While
        sr.Close()
        fs.Close()

StreamReader是繼承自TextReader.封裝了一些對流進行文本讀取的方法

#20


呵呵,彻底明白啦。
使自己没好好看File.Open方法的概念问题。。。

回17楼,谢谢你关注帖子。可是我还没有太看懂你的例子哦。。。
忙着交差,等一下研究一下哈。

不过boblaw 给出的例子很好的,中文网站上面没有,不过你可以看一下这个链接,访问已打开的文件,好像大部分都是用的这个方法哦。
http://www.atmarkit.co.jp/fdotnet/dotnettips/707shareread/shareread.html

#21


哦,是这样的。

#22


结贴给分啦。。。。。。。。。。。。。。。。。。

#1



        Dim fs As FileStream = File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        Dim sr As StreamReader = New StreamReader(fs)
        While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
        End While
        sr.Close()
        fs.Close()
        '除使用ReadLine之外,也可使用ReadToEnd()方法來讀取全部內容

#2


哈,谢谢楼上大侠。。
我试一下上来报告哈

#3


framework2.0...2005

Dim fs As IO.FileStream之后,没有File.Open()这个方法啊?

只有FileOpen()方法,可是写成下面这样的话,报错说不能写成式子,

Dim fs As FileStream = FileOpen("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

单独打开文件,是可以的呀
FileOpen("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

这样子的话,怎么办呢?

#4


使用My.Computer.FileSystem 对象的FileOpen方法试试看。

#5


Imports System.IO

#6


File類的完整命名空間是System.IO.File

#7



谢谢楼上大侠继续回答^@^

答楼上大侠,我试过了,正在用excel格式打开的csv文件,还是读不进来。还是报错。。。

Dim strsplit() As String
Dim fs As IO.FileStream = File.Open(.FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim sr As IO.StreamReader = New IO.StreamReader(fs)
Dim lines As String = sr.ReadLine()
strsplit = Split(sr.ReadLine(), ",")
Dim i As Integer
For i = 0 To UBound(strsplit) - 1
CheckedListBox1.Items.Add(strsplit(i), False)   '我只是读了第一行的标题,绑到checklistbox上。
Next i
sr.Close()
fs.Close()

#8


File.Open(.FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
---------------------------------------------
FileShare.ReadWrite


Dim lines As String = sr.ReadLine() 
strsplit = Split(sr.ReadLine(), ",") 
----------------------------------
每調用一次ReadLine,就會讀一行文本出來,你這裡的讀了兩次,但lines沒再使用了,難道這是你的本意?


另外,如果你是要使用ReadLine一行行讀出全部文本,通常應該按如果方式來執行:

       While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
       End While

#9


谢谢楼上大侠这么耐心。。

1。FileShare.ReadWrite 改成这个之后,可以读了!嗬嗬。谢谢谢谢/
2。关于第二个问题,我原本用的是file.readalllines(),这个方法。
   这样当行数也不确定的情况下,我可以分别对第1行,第2行、以及3行以后的数据进行分类操作。。。

'Dim lines As String() = System.IO.File.ReadAllLines(.FileName, System.Text.Encoding.Default)
'Dim strsplit() As String
'For n As Integer = 0 To 1                '暂时读2行的。。
'    strsplit = lines(n).Split(",")
'    Dim i As Integer
'    For i = 0 To UBound(strsplit)
'        If n = 0 Then
'            CheckedListBox1.Items.Add(strsplit(i), False)
'        Else : n = 1
'            If strsplit(i).ToString = "○" Then
'                'チェック状態を変更する
'                CheckedListBox1.SetItemCheckState(i, CheckState.Checked)
'            End If
'        End If

'    Next i
'Next n

问题:
如果用
       While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
       End While
这个的话,我怎么区别第一行,第二行呢?

我是新手。。如果事态笨的问题,还请包涵哦。。。。 ^\^

#10



呵呵,
上面的问题解决啦。。。用的for,没用while....
谢谢大侠哈。

不过还有一个小问题
如何取得读入的文件的行数呢?

#11



       Dim LineCnt As Integer=0
       While Not sr.EndOfStream 
            Dim line As String = sr.ReadLine() 
            LineCnt+=1
            '進行操作 
        End While 
       '至此,LineCnt就是讀出的總行數了

#12


做VB的啊  我是做C#的给你不一样

#13


谢谢boblaw大侠。。^@^

可是,为什么是FileShare.ReadWrite 
而不是FileShare.Read呢?

这个事件中我只要读,不要写,为什么我设定成FileShare.Read,文件打开的情况下,程序不能读文件呢?

设定成FileShare.ReadWrite ,文件打开的情况下,程序就可以读文件呢?

#14


我找到答案了。。。
 そして3番目のFileShareパラメータだが、これは対象のファイルに対する共有方法指定するもので、これには、「FileShare.None」「FileShare.Read」「FileShare.Write」「FileShare.ReadWrite」「FileShare.Delete」「FileShare.Inheritable」が指定できる。StreamReaderクラスはどうやら、ファイル・オープン時に「FileShare.Read」しか与えていないようなので、ここで「FileShare.ReadWrite」を指定すれば、すでに書き込みでオープン中のファイルをオープンすることができる。

可是觉得,FileShare.Read不就没用了么?

#15


FileShare.ReadWrite 是允許其他程序讀寫,而不是當前程序

#16


引用 15 楼 boblaw 的回复:
FileShare.ReadWrite 是允許其他程序讀寫,而不是當前程序


boblaw 你真厉害,我想拜你为师啦。^@^
不过  ·允許其他程序讀寫·      说得我糊涂了。。。

我验证了一下
条件
1。设定为FileShare.Read
2。csv文件改成'读专用'(汗,不知道该怎么说了)
结果
文件打开的情况下,程序可以读文件。

条件
1。设定为FileShare.Read
2。csv文件正常读写都可。
结果
文件打开的情况下,程序不可以access文件。


也就是说
FileShare.ReadWrite 是打开拥有写权利的文件的。
FileShare.Read 是打开'读专用'的文件的。

对么?
如果设定为·FileShare.ReadWrite·的话,可以同时读文件,对文件没有危险的吧?
如果其他人正在写文件的时候,这边也可以只读进来的话。。。
一般程序是不是不这么设计的呀?

我好罗索。。。辛苦大侠

#17


不知道是什么原因,我看不太懂上面所提到的“sr”.

我使用VB2005做了一个测试,和楼主的代码有些不大一样,我的是这样的:


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim path As String = "D:\aa.csv"

        If System.IO.File.Exists(path) Then
            Dim sb As New System.Text.StringBuilder
            Using sr As IO.FileStream = System.IO.File.Open(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
                Dim array As Byte() = New Byte(1024) {}
                Dim length As Integer = 0
                Do
                    length = sr.Read(array, 0, 1024)
                    Dim str As String = System.Text.Encoding.GetEncoding("gb2312").GetString(array, 0, length)
                    sb.Append(str)
                Loop While (length = 1024)
                Dim lines As String() = sb.ToString.Split(New String() {ChrW(13) & ChrW(10)}, StringSplitOptions.RemoveEmptyEntries)
            End Using
        End If

    End Sub

#18


File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
---------------------------------------------------------------
如上代碼,FileAccess是表示當前程序需要的訪問權限,而FileShare是表示允許其他程序的訪問權限.

你用Excel打開csv文件時,Excel肯定具有讀寫權限.這時候你的程序打開這個csv文件,如果你設置FileShare.Read(也就是衹允許其他文件衹讀)是不行的,因為Excel已經有讀寫權限了,你衹允許衹讀是不行的,設為ReadWrite剛好符合.

#19


to hbxtlhx :
我用的也是vb2005.下面的代碼是有測試過OK的

      Dim fs As FileStream = File.Open("C:\Book1.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        Dim sr As StreamReader = New StreamReader(fs)
        While Not sr.EndOfStream
            Dim line As String = sr.ReadLine()
            '進行操作
        End While
        sr.Close()
        fs.Close()

StreamReader是繼承自TextReader.封裝了一些對流進行文本讀取的方法

#20


呵呵,彻底明白啦。
使自己没好好看File.Open方法的概念问题。。。

回17楼,谢谢你关注帖子。可是我还没有太看懂你的例子哦。。。
忙着交差,等一下研究一下哈。

不过boblaw 给出的例子很好的,中文网站上面没有,不过你可以看一下这个链接,访问已打开的文件,好像大部分都是用的这个方法哦。
http://www.atmarkit.co.jp/fdotnet/dotnettips/707shareread/shareread.html

#21


哦,是这样的。

#22


结贴给分啦。。。。。。。。。。。。。。。。。。