2017-05-10 8 views
4

Ich habe viele Möglichkeiten versucht, ein Verzeichnis zu bekommen, in dem ich die .exe einer Anwendung speichern kann, die dort bleiben muss, aber jedes einzelne Verzeichnis, das ich versuche, sagt Zugriff verweigert.Wo sollte ich Anwendungsdaten speichern?

Welchen Pfad sollte ich dafür schreiben? Sicherlich muss es einen Pfad geben, auf dem Admin Permission nicht stimmt? Ich bin mir sicher, dass ich gesehen habe, dass dies schon vorher gemacht wurde.

Was habe ich ausprobiert? Diese

Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData) 

Diese

Path.GetTempPath() 

Und das

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) 

Kann hier jemand helfen? Hier ist mein vollständiger Code, vielleicht hat es etwas mit dem Herunterladen zu tun?

string downloadUrl = "http://example.com/example.txt"; 
string savePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/Fox/example.txt"; 

if (!Directory.Exists(savePath)) 
{ 
    Directory.CreateDirectory(savePath); 
} 

using (var client = new WebClient()) 
{ 
    client.DownloadFile(downloadUrl, savePath); 
    Process.Start(savePath); 
} 

der Regel eine Ausnahme in dieser Richtung bekommen

System.Net.WebException occurred 
    HResult=0x80131509 
    Message=An exception occurred during a WebClient request. 
    Source=System 
    StackTrace: 
    at System.Net.WebClient.DownloadFile(Uri address, String fileName) 
    at System.Net.WebClient.DownloadFile(String address, String fileName) 
    at App.Program.Main(String[] args) in c:\users\user\documents\visual studio 2017\Projects\App\App\Program.cs:line 26 

Inner Exception 1: 
UnauthorizedAccessException: Access to the path 'C:\Users\User\App\example.txt' is denied. 

Linie Ausnahme:

client.DownloadFile(downloadUrl, savePath); 
+3

Wenn Sie versuchen, eine beliebige ausführbare Datei einfach herunterzuladen und auszuführen, unterscheiden Sie sich nicht von Malware. Die richtige Art, ausführbare Dateien in Windows zu installieren, ist eine MSI-Datei. –

+0

Wer hat etwas über Malware gesagt? Dies ist auch ein persönliches Projekt, also hat es nichts mit Malware zu tun. –

+0

Und wenn Sie ein Update auf Ihre App herunterladen, sollten Sie es in den Temp-Verzeichnis herunterladen – Dawid

Antwort

0

eine Manifest-Datei zu einem Projekt Hinzufügen von Administratorrechten für die ausführbare Datei könnte ein Weg sein, zu verlangen, um dieses Problem zu lösen.

3

Das Problem ist, dass Sie verwenden savePath zuerst ein Verzeichnis darstellen ...

if (!Directory.Exists(savePath)) 
{ 
    Directory.CreateDirectory(savePath); 
} 

... und dann eine Datei zu repräsentieren ...

client.DownloadFile(downloadUrl, savePath); 

Der Versuch, eine zum Download Datei an %UserProfile%\Fox\example.txt wird mit der Ausnahme fehlschlagen, die Sie angegeben haben, wenn example.txt bereits als Verzeichnis vorhanden ist. Der folgende Ausschnitt zeigt, dass das Problem, das Sie haben nicht eindeutig zuzuordnen sind Downloads in Datei:

// Build a path to a file/directory with a random name in the user's temp directory 
// Does not guarantee that path does not already exist, but assume it doesn't 
string path = Path.Combine(
    Path.GetTempPath(), Path.GetRandomFileName() 
); 
// Create a directory at that path 
DirectoryInfo directory = Directory.CreateDirectory(path); 

// Create a file at the same path 
// Throws UnauthorizedAccessException with message "Access to the path '...' is denied." 
using (FileStream stream = File.Create(path)) 
{ 
} 

Betrachten Sie den Code an die sich ändernden folgenden dieses Problem zu vermeiden:

string downloadUrl = "http://example.com/example.txt"; 
string saveDirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/Fox"; 
string saveFilePath = saveDirectoryPath + "/example.txt"; 

if (!Directory.Exists(saveDirectoryPath)) 
{ 
    Directory.CreateDirectory(saveDirectoryPath); 
} 

using (var client = new WebClient()) 
{ 
    client.DownloadFile(downloadUrl, saveFilePath); 
    Process.Start(saveFilePath); 
} 

Nur ein Hinweis, ich mit Path.Combine statt string Verkettung d empfehlen, wenn Pfade Aufbau:

string saveDirectoryPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Fox"); 
string saveFilePath = Path.Combine(saveDirectoryPath, "example.txt"); 

Es ist plattformübergreifend und kümmert sich um alle die notwendige Logik für dich.

Verwandte Themen