2013-09-01 13 views
6

Sto sfogliando il mio C# in modo che ho deciso di scrivere un programma che posso utilizzare per importare facilmente le foto che prendo. Un po 'di background ... Scatto foto in formato JPEG e RAW e poi analizzo e seleziono i file JPEG in quanto sono più piccoli e più facili da gestire/anteprima. Quindi importare solo i file RAW con cui vale la pena occuparsi della post produzione.C# UnauthorizedAccessException in File.Copy

Volevo scrivere un semplice programma per copiare i file RAW da una directory che corrisponde ai file JPEG che ho passato in un'altra.

Ecco il codice:

static void Main(string[] args) 
    { 
     Console.WriteLine("Enter the JPEG Origin Directory: "); 
     string originDirectory = @"C:\Users\Greg\Pictures\Summer 2013\Back Bay\testJPEG"; 

     Console.WriteLine("Enter the RAW Origin Directory: "); 
     string copyDirectory = @"C:\Users\Greg\Pictures\Summer 2013\Back Bay\testRAW"; 

     Console.WriteLine("Enter the RAW Import Directory: "); 
     string rawCopyDirectory = @"C:\Users\Greg\Pictures\Summer 2013\Back Bay\testRAWImport"; 

     char[] delimiterChars = { '_', '.' }; 

     List<string> filesToCopy = new List<string>(); 
     List<string> CopiedFiles = new List<string>(); 

     foreach (var filePath in Directory.GetFiles(originDirectory)) 
     { 
      Console.WriteLine("Filepath: '{0}'", filePath); 
      string[] words = filePath.Split(delimiterChars); 

      filesToCopy.Add(words[1]); 
     } 

     filesToCopy.ForEach(Console.WriteLine); 

     foreach (var copyFilePath in Directory.GetFiles(copyDirectory)) 
     { 
      string[] delimited = copyFilePath.Split(delimiterChars);  

      if (filesToCopy.Contains(delimited[1])) 
      { 
       Console.WriteLine("Copied: '{0}'", copyFilePath); 

       string fileName = Path.GetFileName(copyFilePath); 

       string sourcePath = Path.GetDirectoryName(copyFilePath); 

       string targetPath = rawCopyDirectory; 

       string sourceFile = System.IO.Path.Combine(sourcePath, fileName); 

       string destFile = System.IO.Path.Combine(targetPath, fileName); 


      System.IO.File.Copy(sourcePath, destFile, true); 

      } 


     } 

     Console.WriteLine("Press any key to exit."); 
     Console.ReadKey(); 

    } 

Tutto sembra funzionare come mi aspetto quando scrivo tutte le variabili alla console, però mi sto un'eccezione sulla Copy.File che indica i file sono sola lettura. Ho controllato, e non lo sono, comunque la cartella stessa è, e nonostante i miei sforzi non riesco a staccare le cartelle di test come readonly. Qualsiasi aiuto sarebbe apprezzato, ho incollato il registro delle eccezioni qui sotto.

System.UnauthorizedAccessException was unhandled 
    HResult=-2147024891 
    Message=Access to the path 'C:\Users\Greg\Pictures\Summer 2013\Back Bay\testRAW' is denied. 
    Source=mscorlib 
    StackTrace: 
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) 
     at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite) 
     at ConsoleApplication1.Program.Main(String[] args) in C:\Users\Greg\documents\visual studio 2010\Projects\Photo Importer\Photo Importer\photoImporter.cs:line 56 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
     at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
     at System.Activator.CreateInstance(ActivationContext activationContext) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

Esplora risorse? –

+0

Sì, è corretto. – user2736424

+0

Hai controllato le autorizzazioni di sicurezza sulle proprietà della cartella? –

risposta

10

Il problema può essere che non è possibile eliminare o sovrascrivere i file di sola lettura. La soluzione è modificare gli attributi.

if(File.Exists(destFile)) 
{ 
    File.SetAttributes(destFile, FileAttributes.Normal); 
} 
File.Copy(sourcePath, destFile, true); 
2

Risulta stavo chiamando la variabile sbagliato File.Copy, e invece stavo cercando di copiare un percorso invece di un file (derp). Tutto funziona ora! Grazie per le risposte!

Problemi correlati