あなたの知らない259文字越えの世界

 Win 32 APIのリファレンスを見ているとこのような旨の文章を見ると思います。Windows NT/2000/XPでは"\\?\"という文字列をパス名の前につけて、Unicode版のAPIを呼び出すことでパス名を約32,000ワイド文字に拡張できる、と。
 これが本当ならなんだかんだ言って皆さんが使うであろうIEではお気に入りに長い名前のフォルダを何段も作ることができて便利そうです。
 本当にそうなのでしょうか?

 拙作のプログラムの製作中に調べたことについてまとめてみました。

いくつかのAPIで試す

 まずは、そもそも259文字を超えるパス名を持つファイルが作れるかどうかAPIの動作を軽く試してみましょう。

API名対応の可否その他
CreateFile
FindFirstFileファイルの情報が入るWIN32_FIND_DATA構造体のファイル名のサイズを考えるとファイルやディレクトリの文字数は259文字を超えることはできないと思われる。
CreateDirectoryサブディレクトリ名に8.3形式に収まるショートファイル名を使うとロングファイル名換算では259文字を超えることができる。
SetCurrentDirectory×
WritePrivateProfileString×

 この結果を見るとカレントディレクトリを使用したアクセスはできないけれども、フルパスを使った基本的なファイルの読み書きと検索はできるのでアプリケーションががんばれば259文字を超えるパス名を持つファイルを使うことはできそうです。

アプリケーションでの対応

 では、アプリケーションの対応はどうでしょうか?

 Windows XPのエクスプローラではパス名が259文字を超えるとエラーが出ました。
 IEはというと、こちらもパス名が259文字を超えたお気に入りにアクセスしようとすると音が鳴ってアクセスできませんでした。ちなみに、128文字を超えるタイトルを持つWebページをお気に入りに入れようとするとお気に入りの長さが128文字に切り詰められました。

 また、ファイルオープンダイアログでもパス名が259文字を超えるパス名を入力できない上に、パス名が259文字を超えるディレクトリを見ることができないので、ファイルオープンダイアログからしかファイルを指定できないアプリではパス名が259文字を超えるファイル名をもつファイルにアクセスできません。多くのプログラムはファイルオープンをファイルオープンダイアログから行うので多くのアプリケーションが259文字を超えるパス名を持つファイルにアクセスできないことになります。

結論

 この結果を見ると文字数259文字越えのパス名を持つファイルは作れなくはないけど、対応しないアプリが多くなることがファイルオープンダイアログの結果から目に見えています。
 よって、文字数が259文字を超えるファイルを作ることはできるけれども現実的には使い物にならないと思われます。

追記

 Javaで作成されたプログラムでは"\\?\"という文字列をパス名の前につけなくても259文字を超えるパス名を持つファイルが作れることがわかりました。
 以下のプログラムを実行するといとも簡単に259文字を超えるパス名を持つファイルが作られます。 (2015/07/20追記)

import java.io.File;
import java.io.IOException;

public class Test259 {

	public static void main(String[] args) {
		//
		File newFile = new File("h:\\test\\test259");
		File newFile2 = new File("h:\\test\\test259\\1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.txt");

		if (!newFile.exists()) {
			newFile.mkdirs();
		}
		try {
			newFile2.createNewFile();
		} catch (IOException e) {
			System.out.println("作成に失敗しました。");
		}
	}

}

御意見、御感想、御希望等ありましたら何でもE-Mailでどうぞ

Tatsuの開発室に戻る


[Tatsu's room on the Web] This page is presented by Tatsu