Meine winform app verwendet xml-Dateien, um Daten zu speichern, wo sollte ich sie speichern, so Vista-Benutzer in sie schreiben können?
Merci
Meine winform app verwendet xml-Dateien, um Daten zu speichern, wo sollte ich sie speichern, so Vista-Benutzer in sie schreiben können?
Merci
Verwenden Sie die Environment.GetFolderPath
um den am besten geeigneten Ordner unabhängig vom Betriebssystem zu finden.
Sie benötigen insbesondere einen der folgenden SpecialFolder-Werte:
ApplicationData
- wenn es sich um Roaming-Dateien pro Benutzer handelt, die nur für die Anwendung bestimmt sind und keine Dokumente darstellen, die für den Benutzer von Interesse sein könnten.LocalApplicationData
- wenn es sich um nicht-roamingfähige, benutzerspezifische Dateien handelt, die nur für die Anwendung bestimmt sind und keine Dokumente darstellen, die den Benutzer interessieren könnten.CommonApplicationData
- wenn es sich um Roaming-Dateien handelt, die allen Benutzern gemeinsam sind und nur von der Anwendung verwendet werden und keine Dokumente darstellen, die den Benutzer interessieren könnten. NOTE : Unter Vista entspricht dies dem C:\ProgramData
der standardmäßig für normale Benutzer schreibgeschützt ist (da sich Änderungen an den Dateien in diesem Verzeichnis auf das Verhalten von Programmen auswirken könnten, die von Administratoren verwendet werden). Sie können entweder die Berechtigungen für Ihren App-Unterordner explizit ändern oder eine der anderen Optionen wählen.MyDocuments
- wenn die Dateien benutzerspezifisch sind und Dokumente darstellen.Beachten Sie, dass es keine SpecialFolder
Aufzählungswert wie CommonDocuments
die einen maschinenweiten Dokumentenspeicher darstellen würde, obwohl es einen Ordner gibt, der als solcher dienen soll ( C:\Documents and Settings\All Users\Documents
unter XP und C:\Users\Public\Documents
unter Vista). Sie müssen die Betriebssystemversion selbst ermitteln und den entsprechenden Ordner auswählen, wenn Sie in diese Speicherorte schreiben möchten.
Intern Environment.GetFolderPath
verwendet die Win32-API SHGetFolderPath
. Die Aufzählung, die von SHGetFolderPath
finden Sie die bekannten Speicherorte für verschiedene andere spezielle Ordner (einschließlich Allgemeine Dokumente). Sie können direkt verwenden SHGetFolderPath
; Sie können es finden p/invoke Definition und die entsprechende CSIDL-Enum-Definition auf PInvoke.net.
Sie können auch die IsolatedStorage
. Es ist jedoch nicht roamingfähig, pro Benutzer, mit begrenztem Kontingent und ist für den Benutzer nicht einfach über den Windows Explorer zugänglich. Als solches ist es wirklich ein Äquivalent mit mittlerem/niedrigem Vertrauen zu SpecialFolder.ApplicationData
.
Environment.GetFolderPath sollte Ihnen sagen, wo Windows Ihre Daten speichern möchte.
Für benutzerspezifische Daten,
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
bringt in der Regel C:\Users\ %Benutzer% \AppData\Roaming
Für gemeinsame Daten,
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
bringt in der Regel C:\ProgramData.
Dies ist auch unter älteren Windows-Versionen möglich; XP gibt normalerweise C:\Documents und Einstellungen\%Benutzer% \Application Daten und C:\Documents und Einstellungen \All Benutzer \Application Daten.
Versuchen Sie es mit IsolatedStorage aus dem .Net Framework. Es wird diese Arbeit für Sie erledigen.
Das Framework kann diese Speicherorte für Sie verwalten, anstatt Laufwerke, Ordner, Dateien usw. zu verwalten. Ziel ist es, einen Bereich zu haben, in dem Sie sich keine Gedanken über Benutzerrechte machen müssen.
Die folgende Codesequenz stammt direkt aus MSDN, zeigt aber genau, wie Sie diese Dateien verwenden würden.
using System;
using System.IO;
using System.IO.IsolatedStorage;
public class ReadingAndWritingToFiles{
public static int Main(){
// Get an isolated store for this assembly and put it into an
// IsolatedStoreFile object.
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
// This code checks to see if the file already exists.
string[] fileNames = isoStore.GetFileNames("TestStore.txt");
foreach (string file in fileNames){
if(file == "TestStore.txt"){
Console.WriteLine("The file already exists!");
Console.WriteLine("Type \"StoreAdm /REMOVE\" at the command line to delete all Isolated Storage for this user.");
// Exit the program.
return 0;
}
}
writeToFile(isoStore);
Console.WriteLine("The file \"TestStore.txt\" contains:");
// Call the readFromFile and write the returned string to the
//console.
Console.WriteLine(readFromFile(isoStore));
// Exit the program.
return 0;
}// End of main.
// This method writes "Hello Isolated Storage" to the file.
private static void writeToFile(IsolatedStorageFile isoStore){
// Declare a new StreamWriter.
StreamWriter writer = null;
// Assign the writer to the store and the file TestStore.
writer = new StreamWriter(new IsolatedStorageFileStream("TestStore.txt", FileMode.CreateNew,isoStore));
// Have the writer write "Hello Isolated Storage" to the store.
writer.WriteLine("Hello Isolated Storage");
writer.Close();
Console.WriteLine("You have written to the file.");
}// End of writeToFile.
// This method reads the first line in the "TestStore.txt" file.
public static String readFromFile(IsolatedStorageFile isoStore){
// This code opens the TestStore.txt file and reads the string.
StreamReader reader = new StreamReader(new IsolatedStorageFileStream("TestStore.txt", FileMode.Open,isoStore));
// Read a line from the file and add it to sb.
String sb = reader.ReadLine();
// Close the reader.
reader.Close();
// Return the string.
return sb.ToString();
}// End of readFromFile.
}
Möchten Sie, dass Ihre Anwendungsdaten benutzerspezifisch sind? Dann sollten Sie in Erwägung ziehen, sie in C:\Users\%username%\%appname%\...
Ansonsten hat @Mike_G nicht unrecht, wenn er vorschlägt, sie einfach in dasselbe Verzeichnis wie Ihre Anwendung zu legen.
EDIT: Außer, wie Ihr Kommentar dort anmerkt, C:\Program Files\...
nicht beschreibbar ist, in diesem Fall würde ich wahrscheinlich erwägen, es in allen Fällen benutzerspezifisch zu machen (mit guten Standardwerten), es sei denn, ich hätte einen guten Grund, es an einem einzigen Ort zu konsolidieren. In diesem Fall würde ich es in die Konfiguration der Anwendung aufnehmen und den Benutzer entscheiden lassen, wo er die Daten speichern will (und kann).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.