Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

querying a directory for files that are complete (not copy-in-progress)

Tags:

c#

.net

I tried to use FileInfo.CreationTime, but it doesn't represent the copy finish time.

I am trying to get a list of files in a directory. The problem is that the call also returns files which are not yet finished copying.

If I try to use the file, it returns an error stating that the file is in use.

How can you query for files that are fully copied?

As below code. Directory.GetFiles() returns which are not yet finished copying.

my test file size is over 200Mb.

if(String.IsNullOrEmpty(strDirectoryPath)){

                txtResultPrint.AppendText("ERROR : Wrong Directory Name! ");
            }else{
                string[] newFiles = Directory.GetFiles(strDirectoryPath,"*.epk");

                _epkList.PushNewFileList(newFiles);

                if(_epkList.IsNewFileAdded()){
                    foreach (var fileName in _epkList.GetNewlyAddedFile()){
                        txtResultPrint.AppendText(DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + "   => ");
                        txtResultPrint.AppendText(fileName + Environment.NewLine);
                        this.Visible = true;
                        notifyIconMain.Visible = true;
                    }

                }else{

                }
            }
like image 927
Sungguk Lim Avatar asked Nov 05 '22 13:11

Sungguk Lim


1 Answers

If performance and best-practices aren't huge concerns then you could simply wrap the failing file operation in an inner-scoped try/catch.

 using System.IO;
 string[] files = Directory.GetFiles("pathToFiles");
 foreach (string file in files) {
     FileStream fs = null;
     try {
         //try to open file for exclusive access
         fs = new FileStream(
             file, 
             FileMode.Open, 
             FileAccess.Read, //we might not have Read/Write privileges
             FileShare.None   //request exclusive (non-shared) access
         );
     } 
     catch (IOException ioe) {
         //File is in use by another process, or doesn't exist
     }
     finally {
         if (fs != null)
             fs.Close();
     }
 }

This isn't really the best design advice as you shouldn't be relying on exception handling for this sort of thing, but if you're in a pinch and it's not code for a client or for your boss then this should work alright until a better solution is suggested or found.

like image 140
Nicholas J. Arnold Avatar answered Nov 15 '22 09:11

Nicholas J. Arnold