11

I am brushing up on my C# so I decided to write a program that I can use to easily import photos that I take. A little background...I shoot photos in JPEG and RAW and then go through and pick through the JPEGs since they are smaller and easier to handle/preview. I then import only those RAW files that are worth messing with in post production.

I wanted to write a simple program to copy the RAW files from one directory that match the JPEGs that I've sifted through in another.

Here is the 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();

    }

Everything seems to be working as I'd expect when I write all the variables to the console, however I'm getting an exception on Copy.File that indicates the files are read only. I checked, and they aren't, however the folder itself is, and despite my best efforts I cannot unflag my test folders as readonly. Any help would be appreciated, I've pasted the exception log below.

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: 
Chris
  • 8,527
  • 10
  • 34
  • 51
user2736424
  • 163
  • 1
  • 1
  • 6
  • Have you checked the Security Permissions on the Folder's Properties? – Mark Hall Sep 01 '13 at 00:40
  • For that folder SYSTEM has full control, the only entry that doesn't have full control is one instance of WMPNetworkSvc, there is, however, another instance that has full control. – user2736424 Sep 01 '13 at 00:46
  • 1
    It maybe that it is hitting a hidden system type file or folder. What happens if you restrict the `GetFiles` to files with a specific file extension? – RobertKenny Sep 01 '13 at 01:04
  • 1
    Turns out I was calling the wrong variable in File.Copy, and instead was trying to copy a path instead of a file (derp). Everything works now! Thanks for the replies! – user2736424 Sep 01 '13 at 01:11

3 Answers3

16

The problem can be that you can not delete or overwrite read-only files. The solution is to change the attributes.

if(File.Exists(destFile))
{
    File.SetAttributes(destFile, FileAttributes.Normal);
}
File.Copy(sourcePath, destFile, true); 
Dmitrii Dovgopolyi
  • 6,231
  • 2
  • 27
  • 44
4

You are trying to access a file outside of what your program can use.

Try looking at this older post Why is access to the path denied?

Community
  • 1
  • 1
ismellike
  • 629
  • 1
  • 5
  • 14
4

Turns out I was calling the wrong variable in File.Copy, and instead was trying to copy a path instead of a file (derp). Everything works now! Thanks for the replies!

user2736424
  • 163
  • 1
  • 1
  • 6