Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

File Locking/Acccess help when copying and deleteing

Posted on 2004-09-08
8
1,972 Views
Last Modified: 2012-06-27

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
Comment
Question by:pjbaratelli
  • 4
  • 4
8 Comments
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 12010124
it can be another process aside from your own who is locking the file (i.e. has it open).
0
 
LVL 1

Author Comment

by:pjbaratelli
ID: 12010322
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
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 12010429
no and that way doesnt really work because I could say ...

if(!IsLocked(@"C:\foo.bar")) {
    //another process opens file here ...
    File.Open ....
}
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 1

Author Comment

by:pjbaratelli
ID: 12010452
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
 
LVL 37

Accepted Solution

by:
gregoryyoung earned 250 total points
ID: 12010493
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
 
LVL 1

Author Comment

by:pjbaratelli
ID: 12011707
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
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 12011720
I would put a 2-3 second Thread.Sleep in between ...

0
 
LVL 1

Author Comment

by:pjbaratelli
ID: 12020359
Okay, this worked great.   My boss is a happy.  Thanks Greg.
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to call weather service by using asmx? 4 44
MediaHelp 4 26
ASP.NET(C#) Eliminating weekends from a date range 2 45
Adding items to a C# list incrementally 5 30
Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question