none
Open a file that is already opened by another app in readonly mode RRS feed

  • General discussion

  • I have a vb.net app that imports a csv file created in Excel.  Very often the users forget to close the Excel app and get the following error message in my vb app:

    An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

    Additional information: The process cannot access the file "C:\WestBond\import.csv" because it is being used by another process.

    Yes. I can trap the error message and have the user close the Excel process.  I think a better method is to open the file as share readonly mode if that is possible. Can someone tell me how I can open the csv file as share readonly for import while the file is being used (ie opened) by Excel.

    I used the OpenFileDialog and already set the OpenFileDialog.ShowReadOnly = True .  

    Thanks.

    Friday, May 9, 2003 11:17 AM

All replies

  • If it's locked from Excel I don't think you can do that (but I'm no expert).  I think just closing Excel or asking them if they want to close it because it needs that file would be appropriate.
    Saturday, May 10, 2003 8:10 PM
  • I know it is possible because another application written in MS C++ had no problem in accessing the opened CSV file without generating an error message and that is why my client insisting on having this way.  It does not look good on me if another programmer can do it and I cannot.  Help!
    Saturday, May 10, 2003 8:35 PM
  • what's the code in C++ that can do it, can you post it?
    Saturday, May 10, 2003 8:58 PM
  • The C++ app was developed by another firm's programming staff.  We have no access to the source code.
    Sunday, May 11, 2003 12:17 AM
  • This concurrent file openning process works also between MS Office apps.  I tested this one out with Excel openning a csv file first.  I then used Word to open the same csv file and had no problem openning the file if I picked the readonly option from the dialog box.  I guess there must be some sort of open file attribute set somewhere as readonly.
    Sunday, May 11, 2003 2:01 AM
  • Can you post the code that you are using to Open the file?  Is it, perchance the following?

    Dim fs As FileStream = File.OpenRead(Pathname)

    That should be all you need to open a file in ReadOnly mode...
    Monday, May 12, 2003 11:19 AM
  • This is the failed code segment that generated the above error message:

           Dim myOpenFileDialog As New OpenFileDialog()
            Dim srImportFile As StreamReader
            Dim sLine As String

            myOpenFileDialog.CheckFileExists = True
            myOpenFileDialog.DefaultExt = "csv"
            myOpenFileDialog.InitialDirectory = "C:\westside\westbond"
            myOpenFileDialog.Multiselect = False
            myOpenFileDialog.Filter = "Comma Separated Values (*.csv)|*.csv|All Files (*.*)|*.*"
            myOpenFileDialog.ShowReadOnly = True
            myOpenFileDialog.ReadOnlyChecked = True

            If myOpenFileDialog.ShowDialog = DialogResult.OK Then
                ' it failed in the following line
                srImportFile = New StreamReader(myOpenFileDialog.FileName)
                sLine = srImportFile.ReadLine
            End If

    Monday, May 12, 2003 4:16 PM
  • I tried the

     Dim fs As FileStream = File.OpenRead(Pathname)

    suggestion.

    This does not work either.  I still get the file open error.  It looks like this is not readonly mode either.
    Tuesday, May 13, 2003 9:46 AM
  • Try changing this:

    Dim srImportFile As StreamReader 
    srImportFile = New StreamReader(myOpenFileDialog.FileName) 
    sLine = srImportFile.ReadLine 

    to this:

    Dim srImportFile As StreamReader 
    srImportFile = New StreamReader(File.OpenRead(myOpenFileDialog.FileName))
    sLine = srImportFile.ReadLine 

    and let us know what happens...
    Tuesday, May 13, 2003 10:52 AM
  • No.  It did not work either.  I know it can be done becasue one can open the same csv file in both Excel and Word concurrently as long as the second app opens the file in readonly mode. Thanks for helping.  Are there anything else I can try?
    Tuesday, May 13, 2003 11:37 AM
  • hrm... Okay, how about something like this:

    Dim fs As FileStream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

    I'm kind of grasping at straws because I thought OpenRead was all you needed.  But, it seems that even OpenRead tries to acquire a lock...  The code above should not attempt to acquire a lock on the file.
    Tuesday, May 13, 2003 12:54 PM
  • Thanks Jacob. This worked and solved my concurrent file open problem but the solution generated another new problem for me.  The FileStream class is very hard to use.  I tried to follow on some of the quick start samples and so far having a great deal of problem figuring how to read a line from the csv file.  It was a lot easier to read the data in with Streamreader class and used the Split function to put all the fields into an array.  Do you know any good sample program showing how to use FileStream to do line by line read on csv text file?   This is what I had figured out so far( with a read pass end of file error):

    Dim fs As FileStream = New FileStream("c:\Input.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
                Dim r As BinaryReader = New BinaryReader(fs)

                Dim output As StringBuilder = New StringBuilder()
                r.BaseStream.Seek(0, SeekOrigin.Begin)

                Do While r.PeekChar() > -1
                    output.Append(r.ReadString())
                Loop

    Is there anyway one can do a FileShare.ReadWrite with StreamReader?
    Wednesday, May 14, 2003 12:53 AM
  • I figured how to use the filestream with streamreader from a kb article.  I was looking at a wrong sample code before.  Is working now.  Thanks a lot guys.
    Wednesday, May 14, 2003 12:02 PM
  • Just in case you didn't go this route, one the StreamReader's overloaded constructors takes a FileStream as a paramter..  I think that would be the easiest method:

    Dim sr As StreamReader = New StreamReader(myFileStream)
    Wednesday, May 14, 2003 12:33 PM
  • That is exactly the method I used.  Once again, thanks for your help.
    Wednesday, May 14, 2003 2:05 PM
  • I am trying to write an app that does the exact same thing. I can't figure out how to get the current line that I've grabbed from the csv file into the database. Do you know where there are any samples I can look at?

    Thank you!
    Thursday, July 10, 2003 7:56 PM
  • Look up the split function.  The split function will use the comma to separate the fields and put the results into an arrary for you.  Loop through the array elements and build your SQL insert statement base on that.

    This is partial incomplete code:

    cnSQL = New SqlConnection(strConn)
    cnSQL.Open()

    srImportFile = New StreamReader(sFileName)

    sLine = srImportFile.ReadLine

    sColumns = Split(sLine, ",")


    sSQL = "INSERT INTO MyDatabaseTable (DataField1, DataField2) Values (sColumns(0), sColumns(1))

    cmSQL = New SqlCommand(strSQL, cnSQL)
    cmSQL.ExecuteNonQuery()

    I help this help you to get started.
    Thursday, July 10, 2003 10:17 PM