• Visitors can check out the Forum FAQ by clicking this link. You have to register before you can post: click the REGISTER link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below. View our Forum Privacy Policy.
  • Want to receive the latest contracting news and advice straight to your inbox? Sign up to the ContractorUK newsletter here. Every sign up will also be entered into a draw to WIN £100 Amazon vouchers!
Collapse

You are not logged in or you do not have permission to access this page. This could be due to one of several reasons:

  • You are not logged in. If you are already registered, fill in the form below to log in, or follow the "Sign Up" link to register a new account.
  • You may not have sufficient privileges to access this page. Are you trying to edit someone else's post, access administrative features or some other privileged system?
  • If you are trying to post, the administrator may have disabled your account, or it may be awaiting activation.

Previously on ".net detecting file in use"

Collapse

  • russell
    replied
    Rewrite it in C using ZeroMQ.

    Leave a comment:


  • ASB
    replied
    Originally posted by eek View Post
    +1 fullautomatix's stackoverflow link is the right approach if you simply want to check if a file .

    If you have full control the unix lock file approach provides you with more information which may be useful if processes hit a snag.
    That is what I've done. The only issue that I have is if the IOException arises because of something other than a lock. It's probably OK since it does a limited number of retrys and then throws.

    However I did find this which might be useful, need to think about it because it is reliant on a specific result as a magic number so is vulnerable to change and different platform issues:-

    catch (IOException e)
    {
    return (Marshal.GetHRForException(e) & 0xFFFF) == 32;
    }

    The only other idea I could think of was to create a machine wide synchroinzation object and lock through that. In effect this means a named mutex I think. Certainly a bit of a faff.

    A final thought was to open the file differently (e.g. read write allow share) and then call "lock" - the documentation states that the only reason for the IOException this can throw is because it is locked, but then I can't assume anything about how the other process might have the file opened so that doesn't work either.

    Cheers folks.

    Leave a comment:


  • ASB
    replied
    Originally posted by AtW View Post
    1) Don't
    2) Use DB
    Ever helpful.

    1) Have to
    2 Can't don't have one.

    (Granted I am inclined to agree in many ways).

    Leave a comment:


  • AtW
    replied
    Originally posted by ASB View Post
    I have 2 processes writing some info to the same file.

    Any suggestions? Surely there must be a simple way. Haven't turned anything by googling so maybe not.
    1) Don't
    2) Use DB

    Leave a comment:


  • russell
    replied
    Originally posted by fullyautomatix View Post
    No you were offering a completely idiotic solution and Nick has rightly criticised it.
    Yes it was a bit stupid. I have removed it now.

    Leave a comment:


  • eek
    replied
    Originally posted by fullyautomatix View Post
    No you were offering a completely idiotic solution and Nick has rightly criticised it.
    +1 fullautomatix's stackoverflow link is the right approach if you simply want to check if a file .

    If you have full control the unix lock file approach provides you with more information which may be useful if processes hit a snag.

    Leave a comment:


  • fullyautomatix
    replied
    Originally posted by russell
    Well I was just giving an example, not going to do his job for him.
    No you were offering a completely idiotic solution and Nick has rightly criticised it.

    Leave a comment:


  • fullyautomatix
    replied
    c# - Is there a way to check if a file is in use? - Stack Overflow

    I think some kind of retry attempts logic mechanism is the only way to do it.

    Leave a comment:


  • NickFitz
    replied
    Originally posted by russell View Post
    I assume you don't want to write code that looks at the message because it is a string and isn't all type safe etc? You could do exception.Message.Contains("in use") or something similar?
    Should work a treat, except in Germany, or France, or Japan, or...

    Leave a comment:


  • russell
    replied
    Originally posted by eek View Post
    Use a separate lock file. If lock file exists don't try to open the file. If lock file doesn't exist open file and then create lock file. When file is closed remove the lock file.

    The next stop would be to check if the lock file has existed for a significant amount of time. If it has kill the other process and restart that program.

    Granted its a rather unix way of managing files but if it works steal it.
    What if another app is using the file, and that app doesn't implement your idea of creating lock files?

    Leave a comment:


  • russell
    replied
    Originally posted by ASB View Post
    I have 2 processes writing some info to the same file. It's a small file the contents of which get replaced.

    I'm trying to figure out a reliable way of detecting the file is in use so I Can abort or retry or whatever.

    I create a FileStream using Mode=Create, Access=Write, Share=None

    The problem is that this will throw an IOException if the file is in use. But I can't tell that this is the problem. It could be any other FileException. The only way I could tell is to look at the exception message.

    Any suggestions? Surely there must be a simple way. Haven't turned anything by googling so maybe not.
    I assume you don't want to write code that looks at the message because it is a string and isn't all type safe etc?
    Last edited by russell; 15 March 2012, 14:36.

    Leave a comment:


  • eek
    replied
    Originally posted by ASB View Post
    I have 2 processes writing some info to the same file. It's a small file the contents of which get replaced.

    I'm trying to figure out a reliable way of detecting the file is in use so I Can abort or retry or whatever.

    I create a FileStream using Mode=Create, Access=Write, Share=None

    The problem is that this will throw an IOException if the file is in use. But I can't tell that this is the problem. It could be any other FileException. The only way I could tell is to look at the exception message.

    Any suggestions? Surely there must be a simple way. Haven't turned anything by googling so maybe not.
    Use a separate lock file. If lock file exists don't try to open the file. If lock file doesn't exist open file and then create lock file. When file is closed remove the lock file.

    The next stop would be to check if the lock file has existed for a significant amount of time. If it has kill the other process and restart that program.

    Granted its a rather unix way of managing files but if it works steal it.

    Leave a comment:


  • ASB
    started a topic .net detecting file in use

    .net detecting file in use

    I have 2 processes writing some info to the same file. It's a small file the contents of which get replaced.

    I'm trying to figure out a reliable way of detecting the file is in use so I Can abort or retry or whatever.

    I create a FileStream using Mode=Create, Access=Write, Share=None

    The problem is that this will throw an IOException if the file is in use. But I can't tell that this is the problem. It could be any other FileException. The only way I could tell is to look at the exception message.

    Any suggestions? Surely there must be a simple way. Haven't turned anything by googling so maybe not.

Working...
X