C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: _MAX_PATH について


(過去ログ 54 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■30310 / inTopicNo.1)  _MAX_PATH について
  
□投稿者/ 雲 (21回)-(2008/12/20(Sat) 22:44:15)

分類:[Windows 全般] 

Windows でフルパスの最大文字長?はいくつまでなのか?と思っていたら、
_MAX_PATH というものがあることに気がつきました(今頃。。。)。

ただ、

#define _MAX_PATH 260 /* max. length of full pathname */
#define _MAX_DRIVE 3 /* max. length of drive component */
#define _MAX_DIR 256 /* max. length of path component */
#define _MAX_FNAME 256 /* max. length of file name component */
#define _MAX_EXT 256 /* max. length of extension component */

と定義されていることから、_MAX_PATH = 260 はいくら何でも短すぎでは。
と言う気になってきました。

だとすると、例えば、

GetModuleFileName

でモジュールのフルパスを取得するときには、いったい、いくつの文字列の配列を渡せば良いのか?
というのが、わからなくなってきました。

MSDNを読むと、特に、そのあたりについては、何も言っていないし。

実用上は、TCHAR filepath[32000] とかしておけば良いかもしれませんが、もっと良い
記述方法とかあると嬉しいな。と思っています。

皆さんは、どのようにされているのでしょうか?

引用返信 編集キー/
■30313 / inTopicNo.2)  Re[1]: _MAX_PATH について
□投稿者/ Jitta (564回)-(2008/12/20(Sat) 23:24:48)
Jitta さんの Web サイト
No30310 (雲 さん) に返信
>
> #define _MAX_PATH 260 /* max. length of full pathname */
> #define _MAX_DRIVE 3 /* max. length of drive component */
> #define _MAX_DIR 256 /* max. length of path component */
> #define _MAX_FNAME 256 /* max. length of file name component */
> #define _MAX_EXT 256 /* max. length of extension component */
>
> と定義されていることから、_MAX_PATH = 260 はいくら何でも短すぎでは。
> と言う気になってきました。

なぜ?

_MAX_DRIVE は、ドライブ文字の長さなので、"d:" とか "z:" です。終端子を含めても3文字あれば十分です。
_MAX_DIR は、ディレクトリの長さです。パス デリミタを含めて256文字に制限されています。たぶん、FAT の制限を引きずっている。
_MAX_FNAME は、ファイル名単体の長さです。つまり、ファイル名は256文字、ディレクトリ名は256文字で計512文字いけそうですが、ディレクトリ、ファイル名を含めた「パス名」が、256文字以内に制限されています。

なので、_MAX_PATH は 260 で十分です。

しかし、3200文字(だったかな?)に拡大する方法もあります。"\\hostname\" から始まる文字列の時は、拡張されます。


>
> だとすると、例えば、
>
> GetModuleFileName
>
> でモジュールのフルパスを取得するときには、いったい、いくつの文字列の配列を渡せば良いのか?
> というのが、わからなくなってきました。
>
> MSDNを読むと、特に、そのあたりについては、何も言っていないし。
>
> 実用上は、TCHAR filepath[32000] とかしておけば良いかもしれませんが、もっと良い
> 記述方法とかあると嬉しいな。と思っています。
>
> 皆さんは、どのようにされているのでしょうか?
>
引用返信 編集キー/
■30314 / inTopicNo.3)  Re[1]: _MAX_PATH について
□投稿者/ やじゅ (883回)-(2008/12/20(Sat) 23:29:10)
やじゅ さんの Web サイト
2008/12/20(Sat) 23:39:31 編集(投稿者)

No30310 (雲 さん) に返信
> Windows でフルパスの最大文字長?はいくつまでなのか?と思っていたら、
>
> #define _MAX_PATH 260 /* max. length of full pathname */

一般的には260でいいんじゃんないかな。byteではなく、文字数
http://beefway.hp.infoseek.co.jp/prog/filename.html
http://kanonji.blog4.fc2.com/blog-entry-147.html

ちょー長いファイル名の問題 32,000ワイド文字
http://www.interq.or.jp/www-user/komurak/tips/widefilename.html
引用返信 編集キー/
■30317 / inTopicNo.4)  Re[2]: _MAX_PATH について
□投稿者/ 雲 (22回)-(2008/12/21(Sun) 00:39:16)
No30313 (Jitta さん) に返信
> なので、_MAX_PATH は 260 で十分です。

No30314 (やじゅ さん) に返信
> 一般的には260でいいんじゃんないかな。byteではなく、文字数

済みません。足し算をどこかで誤解していたようです。
実際に、ファイルを作成してみましたが、確かに、文字数で260以上の
ファイルは作れないですね。

=========================================================================================
No30313 (Jitta さん) に返信
> しかし、3200文字(だったかな?)に拡大する方法もあります。"\\hostname\" から始まる文字列の時は、拡張されます。

No30314 (やじゅ さん) に返信
> ちょー長いファイル名の問題 32,000ワイド文字
> http://www.interq.or.jp/www-user/komurak/tips/widefilename.html

なるほど。これは、知りませんでした。
(何に使うのか、若干、気にはなりますが、これを考えなければ、260で、全く問題ないですね)


ちょっと、早とちりなところがあって照れくさいですが、これにて解決とさせてください。

ありがとうございました。

解決済み
引用返信 編集キー/
■30318 / inTopicNo.5)  Re[2]: _MAX_PATH について
□投稿者/ ちゃっぴ (169回)-(2008/12/21(Sun) 00:55:25)
ちゃっぴ さんの Web サイト
対応しないとと困るよ。Backup 系。

ということで、System.IO ダメダメです。
引用返信 編集キー/
■30321 / inTopicNo.6)  Re[3]: _MAX_PATH について
□投稿者/ ちゃっぴ (170回)-(2008/12/21(Sun) 10:07:48)
ちゃっぴ さんの Web サイト
nSize に 0 つけて GetModuleFileName を呼び出せば nSize に必要な size 返ってこないかな?
引用返信 編集キー/
■30322 / inTopicNo.7)  Re[4]: _MAX_PATH について
□投稿者/ Azulean (248回)-(2008/12/21(Sun) 10:18:26)
No30321 (ちゃっぴ さん) に返信
> nSize に 0 つけて GetModuleFileName を呼び出せば nSize に必要な size 返ってこないかな?
読む限りは nSize に切り詰めて nSize を返すよということみたいですね。
http://msdn.microsoft.com/en-us/library/ms683197.aspx
引用返信 編集キー/
■30330 / inTopicNo.8)  Re[2]: _MAX_PATH について
□投稿者/ 渋木宏明(ひどり) (997回)-(2008/12/21(Sun) 16:36:40)
渋木宏明(ひどり) さんの Web サイト
> しかし、3200文字(だったかな?)に拡大する方法もあります。"\\hostname\" から始まる文字列の時は、拡張されます。

NOです。\\hostname\ は、ネットワーク資源を表す時の接頭辞です。

「長い名前」については CreateFile() API のヘルプを参照のこと。

--ここから--
Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加してください。詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。
--ここまで--

引用返信 編集キー/
■30333 / inTopicNo.9)  Re[3]: _MAX_PATH について
□投稿者/ ちゃっぴ (171回)-(2008/12/22(Mon) 00:34:01)
ちゃっぴ さんの Web サイト
本当に参照すべきはこちらですね。

Naming a File or Directory
http://msdn.microsoft.com/en-us/library/aa365247.aspx

UNC の場合の prefix は "\\?\UNC\" ですね。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -