SetCurrentDirectory 関数 (winbase.h)
現在のプロセスの現在のディレクトリを変更します。
構文
BOOL SetCurrentDirectory(
[in] LPCTSTR lpPathName
);
パラメーター
[in] lpPathName
新しい現在のディレクトリへのパス。 このパラメーターでは、相対パスまたは完全パスを指定できます。 どちらの場合も、指定したディレクトリの完全パスが計算され、現在のディレクトリとして格納されます。
詳細については、「 ファイル、パス、名前空間の名前付け」を参照してください。
既定では、名前は MAX_PATH 文字に制限されています。
ヒント
Windows 10 バージョン 1607 以降では、MAX_PATH制限を解除するようにオプトインできます。 詳細については、「ファイル、パス、名前空間の名前付け」の「パスの最大長制限」セクションを参照してください。
重要
現在のディレクトリを MAX_PATH より長く設定すると、 CreateProcessW が失敗します。
null 文字の前の最後の文字は円記号 ('\') である必要があります。 円記号を指定しない場合は、その円記号が追加されます。 したがって、末尾の円記号を含めない限り、パスにMAX_PATH-2 文字を指定>します。その場合は、パスに MAX_PATH-1 文字を指定します。
戻り値
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 になります。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
各プロセスには、次の 2 つの部分で構成される 1 つの現在のディレクトリがあります。
- ドライブ文字の後にコロンが続くディスク指定子、またはサーバー名と共有名 (\\servername\sharename)
- ディスク指定子上のディレクトリ
現在のディレクトリは、プロセスのすべてのスレッドによって共有されます。1 つのスレッドが現在のディレクトリを変更すると、プロセス内のすべてのスレッドに影響します。
マルチスレッド アプリケーションと共有ライブラリ コードは、他のスレッドによって実行される相対パス計算に影響を与えるリスクがあるため、 SetCurrentDirectory 関数の呼び出しを避ける必要があります。 逆に言えば
マルチスレッド アプリケーションと共有ライブラリ コードでは、他のスレッドによって実行される現在のディレクトリへの変更の影響を受けないように、相対パスを使用しないようにする必要があります。
注意
プロセスの現在のディレクトリは、プロセスの実行中にロックされます。 これにより、ディレクトリが削除、移動、または名前変更できなくなります。
Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。
テクノロジ | サポートされています |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | はい |
SMB 3.0 Transparent Failover (TFO) | はい |
スケールアウト ファイル共有 (SO) を使う SMB 3.0 | はい |
クラスターの共有ボリューム ファイル システム (CsvFS) | はい |
Resilient File System (ReFS) | はい |
例
例については、「現在の ディレクトリの変更」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winbase.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |