C# - 在创建的目录上获取UnauthorizedAccessException

时间:2018-06-16 23:03:39

标签: c# file-permissions sharpdevelop writefile

在我的应用程序上,我有一个Config-FileReader - 如果存在Temp目录(在应用程序文件夹上,这里配置将存储为Config.json),这些检查启动,否则应用程序将创造它。这些步骤可以正常使用。

经过几天的开发,我今天创建了一个简单的文件下载器:

    public static void Download(string url, string destination, Callback OnSuccess) {
        System.Diagnostics.Debug.WriteLine("[Download] " + url + " to " + destination + " (" + Utils.getFileName(url) + ")");
        using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.UserAgent] = Software.getName() + "/" + Software.getVersion() + " (" + Software.getOSVersion() + "; " + Software.getOSBit() + "; " + Software.getOSVersionFull() + ")";

                client.DownloadDataCompleted += (s, e) =>
                {
                    var text = e.Result;
                    File.WriteAllText(destination, Path.Combine(destination, Utils.getFileName(url)));
                    OnSuccess((Object) Path.Combine(destination, Utils.getFileName(url)));
                };
                client.DownloadDataAsync(new Uri(url));
            }
    }

当我尝试将文件下载到之前创建的Temp目录时,会出现UnauthorizedAccessException。奇怪的是:目录是由应用程序成功创建的,配置文件将被创建/ readed / writed。

但是当我尝试下载文件时:

API.Download(media.URL, Software.getPath() + "Temp", OnSuccess);

下载程序的调试输出:

  

[下载] https://c-ash.smule.com/sf/s26/arr/88/4e/48afbe6c-9aeb-4cc7-82cf-e04d5f0d6b44.mp3到C:\ Users \ info \ Documents \ SharpDevelop Projects \ SongManager \ SongManager \ bin \ Debug \ Temp(48afbe6c-9aeb-4cc7-82cf-e04d5f0d6b44.mp3)

我没有UnauthorizedAccessException

  

System.UnauthorizedAccessException:拒绝访问路径“C:\ Users \ info \ Documents \ SharpDevelop Projects \ SongManager \ SongManager \ bin \ Debug \ Temp”。

修改

当我使用另一个目录时会出现同样的问题,该目录将在下载开始之前立即创建。

修改2

我的第二个想法是,那是一个线程问题,因为DownloadDataAsync在另一个线程上运行。但是

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate {
    File.WriteAllText(destination, Path.Combine(destination, Utils.getFileName(url)));
}));

无法解决问题。

1 个答案:

答案 0 :(得分:3)

我称之为恶作剧

File.WriteAllText Method (String, String)

  

<强>参数

     
      
  • 路径

         
        
    • 类型:System.String
    •   
    • 要写入的文件。
    •   
  •   
  • 内容

         
        
    • 类型:System.String
    •   
    • 要写入文件的字符串。
    •   
  •   

您的代码

client.DownloadDataCompleted += (s, e) =>
         {
            var text = e.Result;
            // look at your parameters 
            File.WriteAllText(destination, Path.Combine(destination, Utils.getFileName(url)));
            OnSuccess((Object)Path.Combine(destination, Utils.getFileName(url)));
         };

您正在目录上调用File.WriteAllText,并将组合路径作为内容传递。

错误应该是,

  

&#34;远离键盘年轻的绝地,让自己变成咖啡!目录不是文件,您没有业务写入一个&#34;