4

このステートメントを実行すると、次のようになります。

string folderPath = 
   Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);

folderPathはに設定されC:\ProgramDataます。

イミディエイトウィンドウでこのステートメントを実行すると、次のようになります。

Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);

C:\Users\Public\Documentsが表示されます(これは私が期待したものです)。

違いについて何か考えはありますか?

更新7/6/12:

同じexeファイルの異なるクラスで異なる結果が得られます。

ライブラリにあるクラスと、アプリに直接リンクされているクラスが1つあります。

ライブラリクラスは「C:\ProgramData」を返します。リンクされたコードは「C:\ Users \ Public\Documents」を返します。

さらに、ライブラリコードは、「Environment.SpecialFolder.CommonDocuments」と「Environment.SpecialFolder.ApplicationData」の両方に対して「C:\ProgramData」を返します。

リンクされたコードは、「Environment.SpecialFolder.CommonDocuments」の場合は「C:\ Users \ Public \ Documents」を返し、「Environment.SpecialFolder.ApplicationData」の場合は「C:\ Users \ Me \ AppData\Roaming」を返します。

私は困惑しています。

4

2 に答える 2

4

これは、プログラムが 64 ビットの場合に発生する可能性があります。Visual Studio は 32 ビットであるため、イミディエイト ウィンドウで実行するEnvironment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);と、Windows 32 ハイブが検索されますが、プログラムは 64 ハイブを検索します。また、64 ハイブにのみ登録される CommonDocuments フォルダーが移動された可能性があります。

これは、ここで定義されている Windows のバグです。

編集あなたの更新は、同じEXE内の2つのクラスで発生していると言っています。プロセスは 32 ビットまたは 64 ビットのみ (両方ではない) であるため、上記のバグが適用されないことを示します (たとえば、ラッパーを使用した COM ではなく、アセンブリ間の通常の通信を想定)。投稿できる適切なテストにそれを組み込むことができますか?

簡単な確認として、両方が同じプロセスで実行されていることを二重に確認するために、それぞれに次のコードを含めることも価値がある場合があります。

  Console.WriteLine("{0} Process {1} is {2}bit", GetType().ToString(), System.Diagnostics.Process.GetCurrentProcess().Id, IntPtr.Size * 8);
于 2012-07-06T06:02:28.387 に答える
1

C:\ Users \ Public \ Documentsは正しいパスです:

Per Machine “Documents”
“Document” type files that users create/open/close/save in the application that are used across users.  These are usually template or public documents.

Example:    MyTemplate.dot
Windows 7:  C:\Users\Public
Vista:  %SystemDrive%\Users\Public
XP: %ALLUSERSPROFILE%\Documents
Environment Variable:   Vista/Win7: %PUBLIC%  Note: Does not exist on XP
Known Folder ID:    FOLDERID_PublicDocuments
System.Environment.SpecialFolder:   System.Environment.SpecialFolder.CommonDocuments
CSIDL:  CSIDL_COMMON_DOCUMENTS
It’s obvious after looking at all these locations that where you store your files can be challenging if you are targeting multiple OS versions.  The best guidance is to use API’s to find the special folder path.  API’s will return the appropriate location for the target OS.

ソース: http: //blogs.msdn.com/b/patricka/archive/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple- os-versions.aspx

于 2012-07-06T03:45:49.200 に答える