読者です 読者をやめる 読者になる 読者になる

conってなに?

Windows DOSbatch C

はてなのカテゴリーはなんでソートして表示してくれないのか?秀丸から以下のプログラムの実行をした

sort <con >con

「con」ってなにかというと、Windows(MS-DOS時代)からの予約デバイスで
コンソール、すなわち現在入出力を行っている画面・キーボードを表す。
標準出力、標準エラー出力を捨てるための 「nul」と同類。
wikipedia 予約デバイス con
CONCON問題かぁー。懐かしいな。


そんな20世紀の遺物の話なんてどうでもいいよと思うかもしれないが、未だにWindowsは引きずっている。
今のWindowsでも、「con」というフォルダは作成できない。

Windows XPの場合

エクスプローラーから作成しようとするとconという名前を付けても「新しいフォルダ」のまま変わらない。
コマンドプロンプトだと、以下のエラーになる。

D:\temp>mkdir con
ディレクトリ名が無効です。

Windows 7の場合

エクスプローラーから作成しようとすると以下のエラーになり、原因が分かるようになった。

指定されたデバイス名は無効です。

コマンドプロンプトの結果はWindows XPと同じ。


例えば、ユーザーがフォルダのパスを指定して、そのフォルダがなかったら作成するプログラムが
あったとする。
ユーザーが、「com」と間違えて「con」と入力してしまった場合に、エラー判定が抜けていると
予期せぬエラー、システムエラーになったりしてしまう。

#include "stdlib.h"
#include "stdio.h"
#include "windows.h"

int main(int argc, char* argv[]){

	if(CreateDirectory("C:\\con_",NULL)){
		printf("ディレクトリ作成成功\n");
	}else{
		printf("ディレクトリ作成失敗(errno=%d)\n",GetLastError());
		return 1;
	}
	if(CreateDirectory("C:\\con",NULL)){
		printf("ディレクトリ作成成功\n");
	}else{
		printf("ディレクトリ作成失敗(errno=%d)\n",GetLastError());
		return 1;
	}

	return 0;
}

結果は以下で、エラーとなる。

D:\workspace\C_SandBox\02Windows\mkdir_con\Debug>mkdir_con.exe
ディレクトリ作成成功
ディレクトリ作成失敗(errno=267)

case文でエラー値で267を判定していないと、
defaultルートに倒れて、システムエラーとなってしまうパターンだ。
ちなみに、エラー値267は「ディレクトリ名が無効です。」である。

関連あるかもしれない記事


広告を非表示にする