[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1980
  • Last Modified:

File Locking/Acccess help when copying and deleteing


When using the FileInfo object I am trying to copy files from one folder to another. After the copy process is complete, I delete the file in the original folder.  After viewing the logs I see this error every once in awhile.

  The process cannot access the file [filename] because it is being used by another process

I have tried numerous pieces of code (GC.collect, fi.refresh, checking for the file being locked, etc ...) and I still get this error and even more frequently.  Here is some of the code.  The project is a windows service.

private void fsw_Watcher_Changed(object sender, System.IO.FileSystemEventArgs e)
            {
                  
                  FileInfo fi = new FileInfo(e.FullPath);      
                  fi.Refresh();
                  if(!fi.Exists) return;      

                  try
                  {
                        string trans_id = this.MakeTransactionID();                                                
                        this.LogReceiptOfFile(fi.Name,trans_id);                  
                        
                        if(fi.Name!="heartbeat.csv")
                        {
                              fi.Refresh();
                              this.CopyToArchive(fi,trans_id);
                        }                        
                        fi.Refresh();
                        this.CopyToOut(fi,trans_id);      
                        fi.Refresh();
                        this.DeleteFromIn(fi,trans_id);
                  }
                  catch(Exception ex)
                  {
                        this.LogError("fsw_Watcher_Changed",ex);
                  }
                  finally
                  {
                        fi = null;
                        GC.Collect();
                  }
            }

            private void LogReceiptOfFile(string fileName,string trans_id)
            {
                  Log myLog = new Log(LOGPATH);
                  myLog.WriteToProcessLog(trans_id,1,"Received","MCGWare",fileName);
                  myLog = null;
            }

            private void LogError(string func,Exception ex)
            {
                  Log myLog = new Log(LOGPATH);
                  myLog.WriteLogMessage(func,ex.Message + "\n" + ex.StackTrace,1);
                  myLog = null;

                  EventLog elog = new EventLog();
                  elog.Source = "Application";
                  elog.Log = "Application";
                  elog.WriteEntry("Error reported in fsw_Watcher_Changed function. Read SDX log files for details.",
                        System.Diagnostics.EventLogEntryType.Error);      
                  elog = null;
            }

            private void CopyToArchive(FileInfo fi,string trans_id)
            {
                  Log myLog = new Log(this.processPath);
                  string fileName =
                        this.archivePath + "\\" +
                        this.MakeFileName(fi.Name.Replace(".csv",""));                  
                  try
                  {
                        fi.CopyTo(fileName,true);
                        myLog.WriteToProcessLog(trans_id,1,"Copy",fi.FullName,fileName);
                  }
                  catch(Exception ex)
                  {
                        this.LogError("CopyToArchive",ex);
                        myLog.WriteToProcessLog(trans_id,0,"Copy",fi.FullName,fileName);
                  }
                  finally
                  {
                        myLog = null;
                  }
            }

            private void CopyToOut(FileInfo fi,string trans_id)
            {
                  Log myLog = new Log(this.processPath);
                  string fileName = this.outPath + "\\" + fi.Name;
                  try
                  {
                        fi.CopyTo(fileName,true);
                        myLog.WriteToProcessLog(trans_id,1,"Copy",fi.FullName,fileName);
                  }
                  catch(Exception ex)
                  {
                        this.LogError("CopyToOut",ex);
                        myLog.WriteToProcessLog(trans_id,0,"Copy",fi.FullName,fileName);
                  }
                  finally
                  {
                        myLog = null;
                  }
            }

            private void DeleteFromIn(FileInfo fi,string trans_id)
            {
                  Log myLog = new Log(this.processPath);
                  try
                  {
                        fi.Delete();
                        myLog.WriteToProcessLog(trans_id,1,"Delete",fi.FullName,"");
                  }
                  catch(Exception ex)
                  {
                        this.LogError("DeleteFromIn",ex);
                        myLog.WriteToProcessLog(trans_id,0,"Delete",fi.FullName,"");
                  }
                  finally
                  {
                        myLog = null;
                  }
            }
0
pjbaratelli
Asked:
pjbaratelli
  • 4
  • 4
1 Solution
 
gregoryyoungCommented:
it can be another process aside from your own who is locking the file (i.e. has it open).
0
 
pjbaratelliAuthor Commented:
Yeah, but how can you check to see if the file is locked? I have used this code to test.

            private bool IsLocked(FileInfo fi)
            {
                  bool locked = false;
                  try
                  {
                        fi.Open(FileMode.Open,FileAccess.Read,FileShare.None);
                  }
                  catch
                  {
                        locked = true;
                  }
                  return locked;
            }

Is there another way? This one didn't seem to work.
0
 
gregoryyoungCommented:
no and that way doesnt really work because I could say ...

if(!IsLocked(@"C:\foo.bar")) {
    //another process opens file here ...
    File.Open ....
}
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
pjbaratelliAuthor Commented:
How could you do it then? That was an example I got off a web site in desperation.  Is there an attribute that I should be looking at?
0
 
gregoryyoungCommented:
no .. you need to handle the case that it may fail ... remember its another process that may be opening your file there is no way of reliably handling it.
0
 
pjbaratelliAuthor Commented:
What would be a good process flow to follow? Three tries and then send an alert to someone of failure?  Should I wait so many seconds before each try? The object is to get it so that these files get to where there going 100% if the time.  Where programatically or manually.
0
 
gregoryyoungCommented:
I would put a 2-3 second Thread.Sleep in between ...

0
 
pjbaratelliAuthor Commented:
Okay, this worked great.   My boss is a happy.  Thanks Greg.
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now