一日に何度も質問して申し訳ないです。
VC++.net 2005
Win32 PlatformSDK
の環境で、Win2000/XPで動作するアプリケーションを作成中です。
カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を作成しています。
引数に指定した相対パスが既に絶対パスだった際に、カレントディレクトリを無視してそのままフル
パスとして返す、という仕組みを作りたいのですが、絶対パスの識別方法がいまいちわかりません。
(というか、正しいやり方か確信がもてません)
一応 path[1] == ':' という式が真なら絶対パスと識別しているのですがこれで大丈夫でしょう
か?
一応
C:/test/
みたいなタイプの絶対パスしかないことを想定しているのですが・・・・
まあ、何を懸念しているのかといいますと、
CC:/test/
例えばこんなパスはありえるのか?ということです(二文字目が:でない絶対パス)
ネットで絶対パスについて調べようとしたところ、ホームページの作り方とかhttpから始まるパスに
関することばかりで、途中で投げ出しました。
こんなダメダメな私ですが是非ご教授いただけると助かります。
絶対パスやファイルパス操作のアルゴリズムに関する資料サイトなども紹介していただけるとさらに
助かります。
よろしくお願いします。
shlwapiのPathIsRelativeで絶対パスかどうかという判定ができるらしい。
shlwapiはパス関係のライブラリです。
その一部(載っていないのもある)ですが、
http://www5a.biglobe.ne.jp/~crab/winsdk/path_func.html
が参考になるかも。
> CC:/test/
> 例えばこんなパスはありえるのか?ということです(二文字目が:でない絶対パス)
あ、ちなみに、
プログラム上のミス等で作られた不正なパスではなく、
あくまで、windowsで正常に識別できるパスであることを前提で、ありえるのか?ということです。
見てて見つけた。
PathSearchAndQualify って関数は、カレントドライブからのパスを生成するらしいね。
Blue様
お早い返答ありがとうございます。
わざわざそういった関数があるということは、やはりpath[1] == ':'のように単純な式では識別し
きれない例外がいろいろあるのでしょうね・・・・
フムフム
あ、ちなみに、
関数内部でSetCurrentDirectoryとか使ってカレントディレクトリ変更したくないのも、独自関数
作ろうとしている理由のひとつであります。
わがままで申し訳ない。
何度も補足いれて申し訳ない。
shlwapiのPathIsRelative使えば解決できそうだけど、できれば勉強もかねて自作したいと考えて
ます。
なにか情報あれば、よろしくお願いします。
フルパスとはいったい何か?を定義しないと話は進まないでしょう。
\\server\share\dir\filename.ext (UNC path)
??\?.... (device name , device alias)
\\.\COM12 (device name)
などなどファイルとして認識されるパスにはいくつも種類があります。
パス文字列は char ですか? それとも Unicode?
じつは、こんなこと↓ができます。
subst あ: C:\
これで、「あドライブ」が作れてしまいます。
パス文字列が char だと、path[1] は「あ」の2バイト目になるので、判定に失敗しま
すね。
> tetrapodさん
勉強不足でした、いろいろパスの種類があるんですねぇ・・・・
そうなると、かなり知識が必要そうですね・・・・
> シャノンさん
参考になります。
関数を作成したら自分用のライブラリとして使いまわすつもりなので、できればAsciiとUnicode両
方対応したいです。
みなさんいろいろありがとうございました。
> カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を
> 作成しています。
<例> 具体例記述がないので想像ですが、
(1) カレントディレクトリ名(パス無し) : ABC
(2) カレントディレクトリの親パス : C:\aaa\bbb
なら、
(3) カレントディレクトリの絶対パス : C:\aaa\bbb\ABC
を生成したいという事でしょうか?
<例の実現について>
カレントディレクトリのフルパスなら、そんな事しなくても
(そんな関数作らなくても)、
GetCurrentDirectory()でフルパス取得すればいいのでは?
1.もし、カレントディレクトリに限らずという事であれば、
(1)と(2)を\で文字列連結する
char szDirFullPath[256];
sprintf_s(szDirFullPath, sizeof(szDirFullPath),
%s\\%s, ABC, C:\aaa\bbb);
2.されらに存在ディレクトリ・フルパスかチェックしたいなら
DWORD dwRtn;
dwRtn = GetFileAttributes(
(LPCSTR)szDirFullPath );
if ((dwRtn & FILE_ATTRIBUTE_DIRECTORY) == 0)
{ //指定したDIRパスは存在しません
}
てな具合では如何でしょうか?
解決チェック後の返信どうもです。
> カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を
> 作成しています。
> <例> 具体例記述がないので想像ですが、
具体的には、
string RilaPathToFullPath( const char *dir, const char *rila )
という関数ががあったとして、引数はそれぞれ
dir : カレントディレクトリ(というか相対パス元のディレクトリ)
rila : 相対パス
戻り値 : 絶対パス
で、rilaにはさらに、絶対パスが入っている場合があります。
rilaが相対パスなら、dirと合成し、
絶対パスなら、そのままを返す。
という内容の関数です。