Search code examples
c#asp.netfilefile-upload.net-2.0

Am I doing it right while reading a file?


This code is trying to read a file but giving error,

   System.IO.IOException: The process cannot access the file 'C:\doc.ics' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   at System.IO.StreamWriter..ctor(String path)

I think this is the code causing the problem while reading file, it works fine on development and integration servers but not on production server.

    private byte[] ReadByteArrayFromFile(string fileName)
    {
        byte[] buffer = null;
        FileStream filestrm = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader binaryread = new BinaryReader(filestrm);
        long longNumBytes = new FileInfo(fileName).Length;
        buffer = binaryread.ReadBytes((int)longNumBytes);
        return buffer;
    }

Solution

  • You're not doing right: whenever you open a file stream, you must dispose it.

    This will do the trick:

    private byte[] ReadByteArrayFromFile(string fileName)
        {
            byte[] buffer = null;
    
            using(FileStream filestrm = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            using(BinaryReader binaryread = new BinaryReader(filestrm))
            {
                 long longNumBytes = new FileInfo(fileName).Length;
                 buffer = binaryread.ReadBytes((int)longNumBytes);
            }
    
            return buffer;
        }
    

    using statements will call Dispose() for you, even if an exception is thrown!

    And, of course, you'll avoid file locking.

    Take a look at this article.