簡體   English   中英

File.Copy中的C#UnauthorizedAccessException

[英]C# UnauthorizedAccessException in File.Copy

我正在刷我的C#所以我決定編寫一個程序,我可以用來輕松導入我拍攝的照片。 一點點背景......我用JPEG和RAW拍攝照片,然后瀏覽並選擇JPEG,因為它們更小,更容易處理/預覽。 然后我只導入那些在后期制作中值得搞亂的RAW文件。

我想寫一個簡單的程序來復制一個目錄中的RAW文件,該目錄與我在另一個目錄中篩選的JPEG相匹配。

這是代碼:

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

    }

當我將所有變量寫入控制台時,一切看起來都像我期望的那樣,但是我在Copy.File上得到一個異常,表明文件是只讀的。 我檢查了,但它們不是,但是文件夾本身就是,盡管我付出了最大的努力,但我不能將我的測試文件夾作為只讀取消標記。 任何幫助將不勝感激,我已粘貼下面的例外日志。

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: 

問題可能是您無法刪除或覆蓋只讀文件。 解決方案是更改屬性。

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

您正在嘗試訪問程序可以使用的文件之外的文件。

嘗試查看這篇較舊的帖子為什么訪問路徑被拒絕?

事實證明我在File.Copy中調用了錯誤的變量,而是試圖復制路徑而不是文件(derp)。 現在一切正常! 謝謝你的回復!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM