私が知っている最も簡単な方法は、SHGetFolderPath
functionをP/Invokeすることです。これは.NET FrameworkがEnvironment.SpecialFolders
の値を取得するために内部的に使用するものです。
定義は次のようになります。
[DllImport("shell32.dll"), CharSet = CharSet.Auto]
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken,
uint dwFlags, [Out] StringBuilder pszPath);
ます。またCSIDL_COMMON_DOCUMENTS
定数が必要になります。
const int CSIDL_COMMON_DOCUMENTS = 0x002e;
が存在しない場合は、力にフォルダを作成したい場合は、あなたがCSIDL_FLAG_CREATE
フラグを渡す必要があります:Windowsのヘッダからの直接。次のようにそれが定義されています
const int CSIDL_FLAG_CREATE = 0x8000;
はこのようにそれを呼び出す:ちょうどあなたの情報のため
public static string GetCommonDocumentsFolder()
{
StringBuilder sb = new StringBuilder();
int retVal = SHGetFolderPath(IntPtr.Zero,
CSIDL_COMMON_DOCUMENTS | CSIDL_FLAG_CREATE,
IntPtr.Zero,
0,
sb);
Debug.Assert(retVal >= 0); // assert that the function call succeeded
return sb.ToString();
}
、SHGetFolderPath
機能は、シェル(SHGetKnownFolderPath
の賛成でのWindows Vistaのよう推奨されていませんチームはこれらのことを変えるのが大好きです)。この新しい関数は、新しい識別子のセットをもたらします。 CSIDL
の値の代わりに、KNOWNFOLDERID
の値が使用されるようになりました。新しいアプリケーションはすべて新しい機能を使用することをお勧めします。
しかし、古いバージョンの.NET Frameworkをターゲットにしており、アップグレードしたくないと考えると、おそらく最新のAPI関数を呼び出す必要はありません。 :-)
古いものは、Windows Vistaと7では、たとえ内部的には新しい機能の薄いラッパーとして実装されていても、うまく動作します。 Windows 8でエラーが発生した場合は、コードパスを分離するか、最終的にコードを修正し、.NETの最新バージョンにアップグレードする必要があります。
[ダウンロードフォルダ:特別ではない?](http://stackoverflow.com/questions/3795023/downloads-folder-not-special-enough) –