2013-09-01 12 views
6

Ich bereite meine C# auf, also habe ich beschlossen, ein Programm zu schreiben, mit dem ich einfach Fotos importieren kann, die ich mache. Ein kleiner Hintergrund ... Ich schieße Fotos in JPEG und RAW und gehe dann durch die JPEGs, weil sie kleiner und einfacher zu handhaben/Vorschau sind. Ich importiere dann nur die RAW-Dateien, mit denen es sich in der Postproduktion zu messen lohnt.C# UnauthorizedAccessException in File.Copy

Ich wollte ein einfaches Programm schreiben, um die RAW-Dateien aus einem Verzeichnis zu kopieren, die mit den JPEGs übereinstimmen, die ich in einem anderen gesichtet habe. Hier

ist der Code:

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(); 

    } 

Alles scheint zu funktionieren, wie ich erwarten würde, wenn ich alle Variablen an die Konsole zu schreiben, aber ich bin eine Ausnahme auf Copy.File bekommen, dass die Dateien anzeigt, sind schreibgeschützt. Ich habe überprüft, und sie sind nicht, aber der Ordner selbst ist, und trotz meiner besten Bemühungen kann ich nicht meine Test-Ordner als nur lesen. Jede Hilfe wäre willkommen, ich habe das Ausnahmeprotokoll unten eingefügt.

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

Windows Explorer? –

+0

Ja, das ist richtig. – user2736424

+0

Haben Sie die Sicherheitsberechtigungen in den Eigenschaften des Ordners überprüft? –

Antwort

10

Das Problem kann sein, dass Sie schreibgeschützte Dateien nicht löschen oder überschreiben können. Die Lösung besteht darin, die Attribute zu ändern.

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

Stellt sich heraus, ich war die falsche Variable in File.Copy Aufruf und stattdessen versuchte, einen Pfad statt einer Datei (derp) zu kopieren. Alles funktioniert jetzt! Danke für die Antworten!

Verwandte Themen