絶対パスと相対パスの識別方法は? – プログラミング – Home

絶対パスと相対パスの識別方法は?
 
通知
すべてクリア

[解決済] 絶対パスと相対パスの識別方法は?


もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

一日に何度も質問して申し訳ないです。
VC++.net 2005
Win32 PlatformSDK
の環境で、Win2000/XPで動作するアプリケーションを作成中です。

カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を作成しています。
引数に指定した相対パスが既に絶対パスだった際に、カレントディレクトリを無視してそのままフル
パスとして返す、という仕組みを作りたいのですが、絶対パスの識別方法がいまいちわかりません。
(というか、正しいやり方か確信がもてません)

一応 path[1] == ':' という式が真なら絶対パスと識別しているのですがこれで大丈夫でしょう
か?

一応
C:/test/
みたいなタイプの絶対パスしかないことを想定しているのですが・・・・

まあ、何を懸念しているのかといいますと、
CC:/test/
例えばこんなパスはありえるのか?ということです(二文字目が:でない絶対パス)

ネットで絶対パスについて調べようとしたところ、ホームページの作り方とかhttpから始まるパスに
関することばかりで、途中で投げ出しました。

こんなダメダメな私ですが是非ご教授いただけると助かります。
絶対パスやファイルパス操作のアルゴリズムに関する資料サイトなども紹介していただけるとさらに
助かります。

よろしくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

shlwapiのPathIsRelativeで絶対パスかどうかという判定ができるらしい。

shlwapiはパス関係のライブラリです。
その一部(載っていないのもある)ですが、
http://www5a.biglobe.ne.jp/~crab/winsdk/path_func.html
が参考になるかも。


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

> CC:/test/
> 例えばこんなパスはありえるのか?ということです(二文字目が:でない絶対パス)
あ、ちなみに、
プログラム上のミス等で作られた不正なパスではなく、
あくまで、windowsで正常に識別できるパスであることを前提で、ありえるのか?ということです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

見てて見つけた。
PathSearchAndQualify って関数は、カレントドライブからのパスを生成するらしいね。


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

Blue様
お早い返答ありがとうございます。
わざわざそういった関数があるということは、やはりpath[1] == ':'のように単純な式では識別し
きれない例外がいろいろあるのでしょうね・・・・
フムフム


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

あ、ちなみに、
関数内部でSetCurrentDirectoryとか使ってカレントディレクトリ変更したくないのも、独自関数
作ろうとしている理由のひとつであります。
わがままで申し訳ない。


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

何度も補足いれて申し訳ない。
shlwapiのPathIsRelative使えば解決できそうだけど、できれば勉強もかねて自作したいと考えて
ます。
なにか情報あれば、よろしくお願いします。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

フルパスとはいったい何か?を定義しないと話は進まないでしょう。
\\server\share\dir\filename.ext (UNC path)
??\?.... (device name , device alias)
\\.\COM12 (device name)
などなどファイルとして認識されるパスにはいくつも種類があります。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

パス文字列は char ですか? それとも Unicode?
じつは、こんなこと↓ができます。
 subst あ: C:\
これで、「あドライブ」が作れてしまいます。
パス文字列が char だと、path[1] は「あ」の2バイト目になるので、判定に失敗しま
すね。


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

> tetrapodさん
勉強不足でした、いろいろパスの種類があるんですねぇ・・・・
そうなると、かなり知識が必要そうですね・・・・

> シャノンさん
参考になります。
関数を作成したら自分用のライブラリとして使いまわすつもりなので、できればAsciiとUnicode両
方対応したいです。

みなさんいろいろありがとうございました。


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

一応こんなのを発見した。
http://hp.vector.co.jp/authors/VA022575/c/path.html


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

一応こんなのを発見した。
http://hp.vector.co.jp/authors/VA022575/c/path.html


返信引用
とるまリンゴ
 とるまリンゴ
(@とるまリンゴ)
ゲスト
結合: 19年前
投稿: 35
 

> カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を
> 作成しています。

<例> 具体例記述がないので想像ですが、
(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パスは存在しません
}

てな具合では如何でしょうか?


返信引用
もふ
 もふ
(@もふ)
ゲスト
結合: 18年前
投稿: 14
Topic starter  

解決チェック後の返信どうもです。

> カレントディレクトリと相対パスを引数に入れて、フルパスを得る関数を
> 作成しています。
> <例> 具体例記述がないので想像ですが、

具体的には、

string RilaPathToFullPath( const char *dir, const char *rila )
という関数ががあったとして、引数はそれぞれ
dir : カレントディレクトリ(というか相対パス元のディレクトリ)
rila : 相対パス
戻り値 : 絶対パス

で、rilaにはさらに、絶対パスが入っている場合があります。

rilaが相対パスなら、dirと合成し、
絶対パスなら、そのままを返す。

という内容の関数です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました