存在不明のパス名からディレクトリを構築する


公開 (UL): 2020-06-07
更新 (UD): 2020-06-07
閲覧 (DL): 2020-08-09

この記事のもくじ

前の記事

2020-05-04
UTF-8 と UNICODE の変換

最近の記事

2020-05-04
エスケープ文字変換/復元
2020-03-23
準プレーンテキスト形式
2019-12-06
プレーンテキスト文字化けのブラウザとサーバ対策
新着情報

新着情報 Recent docs.

Sorry, but almost these pages are only Japanese.
貧乏人を殺す行政の構造 «Structurally, the administrators kill the poors in Japan.»
ヘタすると多摩川に流されるところだった台風 19 号

 ↑
この記事に対する調布市の反応
「事故防シート」について «Cared persons taking with "Jiko-​Bow-​Sheet" prevents from accidents.»
介護現場の負担軽減と事故防止のアイデア
表計算ソフトに「個人情報保護機能」を仕込む方法 «Prevention to leak private-data with spread-​sheet macro function.»
「漏えい」のためのフェイルセーフ
和易ゐ記 (WAI-WIKI) «WAI-WIKI is light­weight markup language for Japanese, and generates HTML on this server on-​demand.»
当サイトで開発/使用中の日本語向けに特化した軽量マークアップ言語
リンク違ってました。すいません。
▼ キーボードの「キー」の詳しい使い方 «The detail about the KEY on keyboard.»
キーボードの個々の「キー」が持つ機能の詳しい説明

人気記事 Frequent view pages.

表計算で「令和」に対応する方法
How to adapt Gengo "Reiwa" on spreadsheet applicaiton.

古いアプリも OK。「表計算 令和」の検索結果上位御礼!
Wary-Basher (ワリバッシャー)
DIY device that enables the handicapped to operate many things with a switch like push-button.

障害者の様々な操作をスイッチ操作で実現する器具。キットも発売中!

ご支援 Support this site.

この活動をご支援いただける方はこちらへ
Could you support this site, see here (but Japanese).

 ファイル作成時,指定パスの存在を確認し,ディレクトリが存在しない場合に根元に近い既存ディレクトリからディレクトリを新規作成してパスを構築していくための処理。

● perl の場合

 関数再帰呼び出しでパラメータのふるまいがおかしかったのでメモ。
 こんな関数を作ったのだが……。

▼ 再帰的ディレクトリの確認と構築(失敗する)
  sub	mkdirRc {
	return( ( -d $_[0] )||
	  ( $_[0] =~ /\/[^\/]+$/ && mkdirRc( $` ) &&
		mkdir( $_[0], 0777 ) ) );
	}

 受け取ったパラメータのパスが既存なら真を返し(2行め),存在しなければ,最後のスラッシュより前の文字列,つまり親ディレクトリのパスを再帰的に自分に渡して再調査(3行め)をしてから,受け取ったパラメータ名でディレクトリを作る(4行め)。途中で何かエラーがあれば,ディレクトリは作られず偽を返す。
 なかなかシンプルに書けたと思っていたが,正しく動作しない。途中で「File exists」というエラーが出る。つまり,存在しないディレクトリでも,「既に存在している(から作れない)」エラーが出る。

 調べたところ,親ディレクトリを辿っていき,存在するディレクトリに行き着くと再帰呼び出しから返って来た時のパラメータ($_[0])が全てそのディレクトリ名になってしまうという現象が起きていた。だから,それ以降は既存ディレクトリ名で mkdir が呼び出されるらしい。
 たとえば,このサブルーチンでファイルを作るためにパスを構築したい時は以下のように呼び出すわけだが……。

▼ ファイル作成のためのディレクトリの構築
	$filname = "/home/user/dir1/dir2/file";
	$filname =~ /\/[^\/]+$/;
	mkdirRc( $` );

 /home/user が既存の場合,親ディレクトリを辿ってそこに行き着くと,そこから返って来た時は呼び出した側の $_[0] も /home/user になってしまっていて,mkdir で「既に存在する」エラーが出てしまう。
 こうしたら出なくなった。

▼ 再帰的ディレクトリの確認と構築(成功する)
  sub	mkdirRc { my $p = $_[0];
	return( ( -d $p )||
	  ( $p =~ /\/[^\/]+$/ && mkdirRc( $` ) &&
		mkdir( $p, 0777 ) ) );
	}

 1行めの my $p に値を移しただけなのだが。パラメータ配列(@_)というのは,そのサブルーチン「唯一」のものなのか?
 そのワリに,以下の「階乗」を求める関数は正常に動作する。

▼ 階乗を求める
   sub fact { return $_[0] ?( fact( $_[0]- 1 )* $_[0] ): 1; }

 どういう現象なんだろ。



© M.Ishikawa; TREEWARE 2020.