Microsoft Developer Network > Forenhomepage > Visual C# General > How to read files that are exclusively locked by other applications?
Stellen Sie eine FrageStellen Sie eine Frage
 

BeantwortetHow to read files that are exclusively locked by other applications?

  • Freitag, 2. Mai 2008 06:11John DeSouza TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     Enthält Code

    Hi,

    I am trying to read log files that are updated by a daemon process on the server. The daemon process is an COM application writing to the files exclusively. How can I read the files? To simulate the workflow, I have created the following snippet, which reproduces the problem I am facing.

    I get the exception : "The process cannot access the file 'C:\\Temp\\FileLockTest1.txt' because it is being used by another process."

     

     

    static void Main(string[] args)  
     
    {  
     
    FileStream exclusiveWriter = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);  
     
    for (byte counter = 0; counter < 100; counter++)  
     
    {  
     
    exclusiveWriter.WriteByte(counter);  
     
    }  
     
    FileStream sharedReader = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.Open, FileAccess.Read, FileShare.Read);  
     
    sharedReader.Seek(0, SeekOrigin.Begin);  
     
    for (byte counter = 0; counter < 100; counter++)  
     
    {  
     
    Console.WriteLine(sharedReader.ReadByte());  
     
    }  
     
    exclusiveWriter.Close();  
     
    sharedReader.Close();  
     
    Console.ReadLine();  
     
    }  
     

     

    Thanks in advance,

    - Johnson

    • BearbeitetJohn DeSouza Dienstag, 3. Juni 2008 09:48Added snipped block
    •  

Antworten

  • Freitag, 2. Mai 2008 16:34ShellShock TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     Beantwortet

    I can only see two options:

     

    1 Get the daemon process code changed so it allows read access. This assumes you have access to the source code, or you can get it changed. Why do people write logging code that exclusive locks the log file? This is very bad practice! Maybe they don't want anyone to ever look at the log?

     

    2. Copy the file as you are already doing.

Alle Antworten

  • Freitag, 2. Mai 2008 07:12EyalShilony TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     
     John DeSouza wrote:

    Hi,

    I am trying to read log files that are updated by a daemon process on the server. The daemon process is an COM application writing to the files exclusively. How can I read the files? To simulate the workflow, I have created the following snippet, which reproduces the problem I am facing.

    I get the exception : "The process cannot access the file 'C:\\Temp\\FileLockTest1.txt' because it is being used by another process."

     

    static void Main(string[] args)

    {

    FileStream exclusiveWriter = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

    for (byte counter = 0; counter < 100; counter++)

    {

    exclusiveWriter.WriteByte(counter);

    }

    FileStream sharedReader = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.Open, FileAccess.Read, FileShare.Read);

    sharedReader.Seek(0, SeekOrigin.Begin);

    for (byte counter = 0; counter < 100; counter++)

    {

    Console.WriteLine(sharedReader.ReadByte());

    }

    exclusiveWriter.Close();

    sharedReader.Close();

    Console.ReadLine();

    }

     

    Thanks in advance,

    - Johnson

    Try to change FileShare.Read to FileShare.ReadWrite .

     

    Best Regards.

  • Freitag, 2. Mai 2008 08:23John DeSouza TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     

     

    Hi,

    Thanks for your reply. I tried changing the FileShare to "ReadWrite". But am still getting the same exception!!

     

  • Freitag, 2. Mai 2008 08:49Sasha GoldshteinMVPTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     
    Of course you are getting the same exception.  If a process opens a file and specifies FileShare.None (which is equivalent to FILE_SHARE_NONE in Win32), then there is no documented way to access the file from another process.  That's the whole idea of the file share enumeration.
  • Freitag, 2. Mai 2008 10:08John DeSouza TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     

    This is an important business requirement and I've got to implement it anyhow. Is there any "undocumented" way or any workaround to get this done?

    Currently I copy the file to a temp location and read it from there. Not the most elegant solution I know. Any help would be appreciated.

     

    Thanks in advance.

     

     

  • Freitag, 2. Mai 2008 16:34ShellShock TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     Beantwortet

    I can only see two options:

     

    1 Get the daemon process code changed so it allows read access. This assumes you have access to the source code, or you can get it changed. Why do people write logging code that exclusive locks the log file? This is very bad practice! Maybe they don't want anyone to ever look at the log?

     

    2. Copy the file as you are already doing.

  • Samstag, 3. Mai 2008 22:25EyalShilony TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     
     ShellShock wrote:

    I can only see two options:

     

    1 Get the daemon process code changed so it allows read access. This assumes you have access to the source code, or you can get it changed. Why do people write logging code that exclusive locks the log file? This is very bad practice! Maybe they don't want anyone to ever look at the log?

     

    2. Copy the file as you are already doing.

     

    1, Not really a bad practice, it might be a requirement to one of the process operations.

     

    2. Not the most elegant solution as the OP said but it should work. Smile

  • Freitag, 9. Mai 2008 08:29John DeSouza TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     

    Hmm.. I have done it by copying the file locally and works fine for now.

    Thank you all for your time.

     

  • Freitag, 9. Mai 2008 08:29John DeSouza TeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     

    Hmm.. I have done it by copying the file locally and works fine for now.

    Thank you all for your time.