2016-03-20 2 views
-1

ich Code schreiben müssen, speichern Sie das folgende Szenario zu behandeln:Was ist der richtige Weg ist, einen Pfad relativ zu My Documents

  1. den Benutzer auffordern, einen Pfad zu einer Datei.
  2. Der Benutzer kann einen Pfad eingeben, der sich unterhalb ihres Ordners "Eigene Dateien" befindet. Der Pfad könnte auch zu einem Speicherort gehören, der nicht mit ihrem Ordner "Eigene Dateien" zusammenhängt.
  3. Speichern Sie den Pfad für eine spätere Suche.
  4. Lesen Sie später den gespeicherten Pfad zu ihrer Datei und laden Sie ihre Datei.
  5. Viele Monate später entscheidet der Benutzer, ihren Ordner "Eigene Dateien" zu verschieben. Windows bietet eine Möglichkeit, dies zu tun. Sie erwartet natürlich, dass meine Anwendung normal weiter funktioniert.

Der Code in Schritt 4 sollte noch funktionieren. Es sollte eine clevere Möglichkeit sein, sich daran zu erinnern, ob der Pfad ein normaler Pfad oder relativ zu My Documents ist, und die Datei entsprechend abzurufen.

Hat die Windows-API diese Funktionalität integriert?

Was ist der richtige Weg?

Gibt es auch eine spezielle Syntax, die der Benutzer eingeben kann, wenn er den Pfad eingibt, sodass die Windows-API automatisch auf den Speicherort relativ zu "Eigene Dateien" verweisen kann?

+0

[SHGetKnownFolderPath] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx) gibt den aktuellen Speicherort zurück. Wie Sie Informationen speichern, die entscheiden, ob die Daten einen * normalen * Pfad oder einen relativen Pfad angeben, liegt ganz bei Ihnen. – IInspectable

Antwort

0

In der API gibt es ShGetKnownFolderPath, unter Verwendung eines KNOWNFOLDERID von FOLDERID_Documents.

Je nachdem, was Sie codieren, könnte es vordefinierte Funktionen dafür geben. Zum Beispiel in .NET, könnten Sie Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) (Links zu MSDN für GetFolderPath und Environment.SpecialFolder)

So verwenden, wenn Sie einen relativen Pfad zu My Documents als Dateinamen speichern, können Sie immer einen absoluten Pfad erstellen, diese Funktionen verwenden.

0

Verwenden SHGetFolderPath(CSIDL_MYDOCUMENTS) oder SHGetKnownFolderPath(FOLDERID_Documents), um den Pfad zu dem Ordner Dokumente zu erhalten, dann überprüfen, ob die Eingabe des Benutzers mit diesem Pfad beginnt, und wenn ja, dann PathRelativePathTo() verwenden, um einen relativen Pfad von ihm zu schaffen. Später können Sie den aktuellen Pfad des Dokumentenordners erneut abrufen und den relativen Pfad mit dem Pfad PathCombine() anhängen.

+0

'SHGetFolderPath' ist veraltet, auch wenn es noch funktioniert ... Ich würde es nicht empfehlen :-) – Jcl

+0

@Jcl Deshalb habe ich auch das' KNOWNFOLDERID' Äquivalent erwähnt. Das OP hat nicht gesagt, welche Version von Windows verwendet wurde. Die 'KNOWNFOLDERID'-API existiert nicht unter XP, was immer noch eine beliebte Version ist, für die/code verwendet wird, auch wenn Microsoft sie nicht mehr unterstützt. 'CSIDL' kann in XP und früher verwendet werden,' KNOWNFOLDERID' kann unter Vista und später verwendet werden. –

-1

Beantworten meiner eigenen Frage. Es stellt sich heraus, dass programmatische Tricks unnötig sind. auch

Siehe: MSDN, sevenforums

ich die Ursache des Problems entdeckt. Die Junction "Meine Dokumente" zeigte nicht auf den neuen Speicherort. Ich habe erwartet, dass Windows7 automatisch die Junction "My Documents" an den neuen Speicherort ändert, aber das hat es nicht getan. Ich konnte das Problem beheben, indem ich das folgende Bit von cmd-Code in der Befehlszeile ausführte.

:: Run this as admin 

:: Delete the wrong junction which points to "C:\Users\{username}\Documents" 
rmdir "My Documents" 

:: Create a new junction to the new My Documents folder 
mklink /J "My Documents" "D:\MyData\Documents" 

:: Change the attributes of the junction, not the folder it points to 
attrib +H +S +I "My Documents" /L 

icacls "My Documents" /setowner SYSTEM /L 
icacls "My Documents" /deny Everyone:(RD) /L 

Der richtige Weg ist der Pfad zu speichern, nur: „C: \ Benutzer {username} \ Eigene Dateien ...“

Wenn dies nicht funktioniert, wird es wahrscheinlich durch eine falsche verursacht Kreuzung von Windows7 erstellt.Die Junction kann mit dem obigen cmd-Code behoben werden.

+0

Dies beantwortet nicht die Frage, die der Fragesteller gestellt hat. -1 –

Verwandte Themen