Windows のファイル-Part2 CRT とUNC
1: void SeparatePath(void)
2: { 3: TCHAR szFile[] = _TEXT("\\\\servername\\Sharename\\path\\base.txt"); 4: TCHAR szDrive[_MAX_DRIVE + 1], szPath[_MAX_DIR + 1], szBase[_MAX_FNAME + 1], szExt[_MAX_EXT + 1];
5:
6: _tsplitpath(szFile, szDrive, szPath, szBase, szExt);
7: _tprintf(_TEXT("szdrive:%s szPath:%s szBase:%s szExt:%s\n"), szDrive, szPath, szBase, szExt); 8: }
典型的なUNCのファイル名をCRT(_tsplitpathは_splitpathのマルチバイト、ワイド文字をコンパイラオプションによって自動判定します)に渡した場合どうなるでしょう?
Part1でも書いたように、_MAX_DRIVEは3ですが、そもそもUNCにドライブ名はありません。よって、実行してみるとこんな結果になります。
つまりUNCの場合、ドライブには値が入らないということになります。必ずドライブ名がある…ということはありません。もちろん、この共有名をたとえばPドライブとしてネットワーク接続して、p:\path\base.txtというファイル名にすれば、szDriveにはちゃんとドライブ名(p:\)が入ります。
クライアントで使う分にはネットワーク接続でドライブ名を接続してしまうということもありますが、ネットワーク接続はユーザん単位なので、ログオンしたユーザと、サーバで処理しているユーザが同じとは限りません。よって、サーバ側の処理ではUNCを使うのが良いのではないでしょうか。
もっとも、サーバはまた特権の問題ではまりやすいポイントがいくつもあります。たとえばNetwork Services権限で動作している場合、ほとんどの場所には書き込みすることができないはずです。権限についてはまた別途書きます。