• 締切済み

絶対パスの取得について

C言語の絶対パスの取得方法をどのようにするかで迷っています。 「stdlib.h」の「_fullpath」という関数を見つけたのですが、ほかにいい関数はないでしょうか?

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

フルパス名の取得は環境に依存しますが、環境になるべく依存しない書き方をしたいのであれば、次のようにするとよいでしょう。 1. full_pathのような独自の関数を作り、とりあえず今の環境に合わせて実装する。 2. full_path関数を宣言するためのヘッダファイルを作成する。 3. 他の環境に移植する場合は、full_path関数を差し替える。 この際、full_path関数だけで1ファイルとし、実装に関わる部分をそのファイル内に閉じ込めることが必要です。 _fullpathやrealpathを直接使うと、<stdlib.h>という標準ヘッダで宣言されているので(移植性の面で)都合が悪いのと、_fullpathという外部識別子を他の環境で自作すると、動作が未定義になる問題が発生します。 GetFullPathNameを直接使うと、型名等の周辺コードまでWindowsに汚染されます。

全文を見る
すると、全ての回答が全文表示されます。
  • fruit893
  • ベストアンサー率68% (15/22)
回答No.5

_fullpath()はWindows固有の関数です。よって、Windowsでしか使えません。内部でGetFullPathName()を呼んでいるだけです。 パスの表現方法はOSに依存するため、OSごとに絶対パスの取得ルーチンを作る必要があります。 例えば、Linuxの場合はrealpath()関数を使います。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/realpath.3.html OSごとに #if で取得ルーチンの中身を分けると良いでしょう。Windowsの場合は必ず _WIN32 が定義されます。(Win32環境はもちろん、Win64環境でも定義されます。) 簡単な例: #if defined(_WIN32) Windowsの場合の処理 #else その他のOSの場合の処理 #endif

全文を見る
すると、全ての回答が全文表示されます。
  • macchun
  • ベストアンサー率50% (3/6)
回答No.4

複数のOSで動作する必要があり、あまりプログラムに慣れていないようでしたら、GetFullPathName() よりも _fullpath() を使用したほうが良いと思います。 理由としては、 1. GetFullPathName() の戻り値は3パターン存在するため、_fullpath() に比べて成否判定が難しいこと 2. _fullpath() の方がOSへ移植しやすいこと(少なくとも私は他のOSで GetFullPathName() と同一の変数をもった関数は見たことがありません) なお、GetFullPathName() を使用するメリットとしては _fullpath() よりも処理速度が速いことと、成否判定を「きちんと」処理すれば、処理をほぼ確実に成功させることができる点です。

全文を見る
すると、全ての回答が全文表示されます。
  • fruit893
  • ベストアンサー率68% (15/22)
回答No.3

> あと引数の型なんですがtypedefで別名をつけた普通の型なんでしょうか? その通りです。 DWORD -> unsigned long 型 LPCTSTR -> char* 型 (もしくは wchar_t* 型) となります。 > よかったら使い方を教えてください。 実行ファイルと同じディレクトリ(フォルダ)に置いたexample.txtの絶対パスを表示するものを例示します。参考にしてください。 #include "stdio.h" #include "windows.h" int main(void){ char buffer[MAX_PATH]; GetFullPathName("example.txt", MAX_PATH, buffer, NULL); puts(buffer); }

noname#16765
質問者

お礼

使い方がわかりました、ありがとうございます。 それでわたしがやりたいことはOSなどをあまり気にしなくてもいけるようにしたいのですが、 「#if」や「#define」のことをよく調べたら出来るでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • fruit893
  • ベストアンサー率68% (15/22)
回答No.2

_fullpath()関数を発見されたとのことなので、Windowsをターゲットにプログラミングされていると思いますが、似たような関数にGetFullPathName()があります。 参考) http://nienie.com/~masapico/api_GetFullPathName.html

noname#16765
質問者

お礼

お返事ありがとうございます。 GetFullPathName()なんですが、私があまりにも初心者なので引数の型とかを見ただけであきらめてしまったものです。 よかったら使い方を教えてください。 あと引数の型なんですがtypedefで別名をつけた普通の型なんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • macchun
  • ベストアンサー率50% (3/6)
回答No.1

絶対パスを取得する必要のあるプログラムは、どのOS上で動作させるのでしょうか? Windows 上で動かすのであれば、GetFullPathName() API の方が良いと思いますし、 Linux の場合には path_resolve を使用(プラットフォームによっては自前で作成する必要があるかもしれませんが・・・)した方が良いと思いますので。

noname#16765
質問者

お礼

書き込みありがとうございます。 OSなんですがとりあえずはWindowsです。 「とりあえず」というのはいろいろなOS上でも動くようにしたいと思っているからです。 そういった場合は「#if」や「#define」を使ったら出来るようになるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#で相対パスを絶対パスへ変換したい

    C#で相対パスを絶対パスへ変換したい C#でプログラミングしています。 以下のようにベースとなる絶対パスと、そこからの相対パスがあるとします。 string basePath = "C:\\Projects\\Test001\\Debug\\"; string relativePath = "..\\..\\Test002\\"; 2つの文字列をただ足し合わせるだけだと、 "C:\\Projects\\Test001\\Debug\\..\\..\\Test002\\" となってしまいます。 これでも目的のパス「C:\\Projects\\Test002\\」にアクセスできますが、なにか既存の関数などを使って、「C:\\Projects\\Test002\\」というちゃんとした絶対パスを取得する方法はないでしょうか?

  • 指定フォルダの絶対パス取得

    初歩的なことですが教えてください。 VB.netにて、指定したフォルダの相対パスに対する絶対パスの取得を行いたいのですが、良い方法が見つかりません。 「Path.GetFullPath メソッド」を使用して見ましたが、存在しないパス「例:\A\」を指定すると、勝手に「例:C:\A\」のように絶対パスが割り付けられてしまいます。実際に存在するパスを検索して取得することは出来ないのでしょうか? 例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。

  • 相対パスから絶対パスの取得

    相対パスを指定することにより、絶対パスを取得したいのですが・・・。 どうすればいいでしょうか? ■状況■ VB6.0 Windows2000 ひとつ上の階層に行きそこのTableフォルダ内のsample.htmlのパスを取得したい。 Dir$("..\Table\sample.html")としてみたのですができませんでした。

  • [Active Basic]デスクトップのパスを取得

    Active Basicでデスクトップへのファイルパスを取得するための方法を教えていただきたいのですが・・・・ C:\Documents and Settings~っといった感じの絶対パス(?)で取得する方法を知りたいです。 どなたか知っている方、いらっしゃいましたらご教授ください。 お願いします。

  • シェルスクリプトでの絶対パスの取得

    UNIXのシェルスクリプトで、引数として渡された相対パスから絶対パスを取得するには、そうすればよいでしょうか。 cd 相対パス 変数=`pwd` これが一番普通のやり方でしょうか。 change directory しなくてもできる方法がないのかなあと思ったもので。

  • 絶対パス名からファイル名を取り出して、変数に格納するバッチ

    DOSコマンドバッチで定義した変数"fullpath"に絶対フルパス名が格納されているとします。 この変数からファイル名だけを抽出して別の変数"filenae"に格納したいのですが方法がわかりません。 1. set fullpath = "C:\test\test.c" 2. ----ここの部分をどのように処理すれば?------ 3. set filename = fullpathから抽出したファイル名 私がやってみた方法として、for文とdir /bを組み合わせてみたのですが for %a in ( dir /b c:\test\test.c ) do set filename =%a 本来dir /bを実行するとファイル名のみが表示されるのに、For文をかますと絶対フルパスでfilenameに値が格納されてしまいます。 dir /b c:\test\test.cの結果を直接filename変数に格納できれば解決するのですが、コマンド結果を変数に格納するにはFor文を使わないとだめなんですよね? なにかよい方法はないでしょうか?

  • エクセルVBA 絶対パスの取得

    アクティブなブックの絶対パスを取得するにはどうすればよいですか?

  • Active Basic フォルダの絶対パスの取得

    ファイルまでの絶対パスの取得のように、自分のフォルダまでのパスを取得するにはどうしたらいいのでしょうか? D:\aaaa\bbbb\cccc\dddd\abcd.exe があって、 D:\aaaa\bbbb\cccc\dddd\ を取得したいのですが・・・ 実験してみたのですが、上手くいきませんでした。 すみませんが、やり方をご教授ください。お願いします。 ↓頑張った証 '自分自身のファイルパスを取得する Dim path[MAX_PATH] As Byte Dim FileName As BytePtr Dim MaxFilePath As Long Dim MyFileName As Long Dim AllByte As Long Dim MidAns As String GetModuleFileName(NULL,path,MAX_PATH) 'ファイルパスからファイル名を抜き出し、その大きさを取得して、引く FileName=malloc(Len(path)+1) GetFileTitle(path,FileName,Len(path)+1) MaxFilePath=Len(path) MyFileName=Len(FileName)+1 AllByte=MaxFilePath-MyFileName 'フォルダまでのパスを抜き出す MidAns=Mid$(path,1,54) free(FileName)

  • 相対パスを絶対パスに変換したい

    こんにちは。 いつもお世話になっております。 ファイルユーティリティ関連のOCXを作成しておりまして、行き詰まってしまいました。 どうかご教示下さい。 内容はタイトルの通り、相対パスを絶対パスに変換したいというものです。 OCXの作りとして、VBから絶対パス、相対パスが区別なく渡されるものとしてどちらでも絶対パスとして内部的に扱いたく思います。 例えばD:\test\bin、D:\test\workというフォルダが存在するとして、 D:\test\bin\sample.exe内で ".\..\work"が渡された場合に OCX内部で"D:\test\work"に変換するというものです。 以下のようなコードも試してみたのですが、どうもうまく動きません。 if(_fullpath(ApsPath, RelPath, 0x100) == NULL){ //変換失敗の場合 ApsPath = RelPath; } どうかよろしくお願いします。 環境:Windows 2000 VC6.0

  • ファイルアップロード時にファイル名の絶対パスを取得を教えてください

    ファイルアップロード時にクライアント側のファイル名の絶対パスを取得する方法を教えてください。 $_FILESには絶対パスでなくファイル名だけしか入っていないのですがこの変数からは取得できないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP