2016-03-20 5 views
-1

を相対パスを保存するための正しい方法は何ですか:私は次のシナリオを処理するコードを記述する必要がマイドキュメントに

  1. プロンプトファイルへのパスのためのユーザー。
  2. ユーザーは、自分の「マイドキュメント」フォルダの下にあるパスを入力することができます。パスは、「マイドキュメント」フォルダとは無関係の場所にもなります。
  3. 後でルックアップするためにパスを保存します。
  4. いつか後で、ファイルに保存されたパスを読み込んで、ファイルを読み込みます。
  5. 数ヶ月後、ユーザーは自分の「マイドキュメント」フォルダの場所を変更することにします。 Windowsはこれを行う方法を提供します。彼女は自然に私のアプリケーションが正常に機能し続けることを期待しています。

手順4のコードは引き続き動作するはずです。パスが通常のパスかマイドキュメントの相対パスかを覚えておき、ファイルをそれに応じて賢明に取得する必要があります。

Windows APIにはこの機能が組み込まれていますか?

これを行う正しい方法は何ですか?

また、パスを入力するときにユーザーが入力できる特殊な構文はありますか?そのため、Windows APIはマイドキュメントに関連する場所を自動的に参照できますか?

+0

[SHGetKnownFolderPath](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx)は、現在の場所を返します。データが*「通常の」*パスまたは相対パスを指定するかどうかを決定する情報を格納する方法は、あなた次第です。 – IInspectable

答えて

0

APIにはShGetKnownFolderPathがあり、KNOWNFOLDERIDFOLDERID_Documentsとしています。

コーディングする内容によっては、あらかじめ定義された機能がある場合があります。たとえば、.NETで、あなたがファイル名としてMy Documentsへの相対パスを保存するのであれば、あなたは常にこれらの機能を使用して、絶対パスを作成することができますEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments)GetFolderPathEnvironment.SpecialFolderのためのMSDNへのリンク)

を使用することができます。そう、それからの相対パスを作成するためにPathRelativePathTo()を使用する場合

0

使用SHGetFolderPath(CSIDL_MYDOCUMENTS)または SHGetKnownFolderPath(FOLDERID_Documents)はその後、ドキュメントフォルダへのパスを取得し、ユーザの入力は、そのパスで始まるかどうかを確認し、します。その後、現在のDocumentsフォルダのパスを再度取得し、PathCombine()を使用して相対パスを追加することができます。

+0

'SHGetFolderPath'はまだ動作していても廃止予定です。私はそれを使用することをお勧めしません: – Jcl

+0

@Jclだから、私も' KNOWNFOLDERID'相当のものを挙げました。 OPは、どのバージョンのWindowsが使用されているかは言いませんでした。 'KNOWNFOLDERID' APIはXP上には存在しません。これはMicrosoftがもうサポートしていなくても、まだ/ codeを使うのによく使われるバージョンです。 'CSIDL'はXP以前では使えますが、' KNOWNFOLDERID'はVista以降で使えます。 –

-1

私自身の質問に答える。プログラマティック・トリックは不要です。

参照: MSDNsevenforums

私は、問題の根本的な原因を発見しました。 「My Documents」ジャンクションは新しい場所を指していませんでした。私はWindows7が自動的に "マイドキュメント"ジャンクションを新しい場所に変更することを期待していましたが、それはできませんでした。私はコマンドラインで次のビットのcmdコードを実行することで問題を解決することができました。

:: 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 

パスを格納するための正しい方法はただである: 「C:マイドキュメント\ \ユーザー{ユーザー名} ...」これが機能しない場合

、それはおそらく間違ってによって引き起こされますWindows7によって作成されたジャンクション。ジャンクションは上記のcmdコードで修正することができます。

+0

これは、質問者が尋ねた質問には答えません。 -1 –

関連する問題