お薦め ページ


メニュー

ハワイ島 遊覧飛行ツアー

ハワイ島 B&B・ホテル

ハワイ島 不動産情報

ハワイ島 情報・観光ガイド

ブログ(Blog)

その他

関連サイト

: 個別エントリー・アーカイブ :

2006年10月14日

DeleteFolderメソッド問題の解決策(1) 「値渡し」と「参照渡し」

前回ブログからの続きで、 DeleteFolderメソッドを実行すると フォルダ名までも消されてしまう 問題の解決策を試してみる。

ということで、前回ブログのスクリプトに変更を加えたのがこちら。
//
//  フォルダ削除実験スクリプト2 WSH(JScript)
//
// FileSystemObject オブジェクトの作成
var FSO = WScript.CreateObject("Scripting.FileSystemObject");

// GetFolderメソッドからフォルダ名を抽出
//   実際は、きちんとリストしないといけませんが
//   ここでは省略して最初に見つかったひとつのサブフォルダだけを扱います。
folderNameEnu = new Enumerator( FSO.GetFolder(".").SubFolders );
var DelFolderName = folderNameEnu.item();

// 消されちゃうんであれば、もう一個 余計に準備しておく。
var DelFolderName2 = DelFolderName;

// 削除前にフォルダ名の表示
WScript.Echo( "削除するフォルダは " + DelFolderName2 + " です。");

// フォルダの削除
FSO.DeleteFolder(DelFolderName, true);

// 結果の表示
WScript.Echo( "削除したフォルダは " + DelFolderName2 + " です。");
ご注意:このスクリプトを実行すると、カレント・フォルダの下にあるサブフォルダをひとつ、 実際に削除してしまいますので、お取り扱いには十分にご注意ください。

これは DeleteFolderメソッドに対して、 引数として与えたフォルダ名の文字列が消されてしまうのであれば、 消される前に それを控えておけばよいであろうと、 ということで単に、
var DelFolderName2 = DelFolderName;
の一行を加えてみた。 ところがその実行結果は前回と変わらず、やはり、 フォルダ名が消されてしまって、 フォルダ削除後のフォルダ名表示ができなかった。

この種の問題は いわゆる「値渡し」 と 「参照渡し」の問題で、 これについては、マイクロソフトの JScript ドキュメント「 JScript: データのコピー、受け渡し、および比較」に記載されている。 このページの説明によると「値渡し」とは
値渡しによるコピーや受け渡しでは、コンピュータのメモリ内に空間が新しく確保され、元の値がそこへコピーされます。 それぞれの値は別の値と見なされるため、値渡しした後で元の値を変更しても、コピーされた値に影響は及びません (逆の場合も同様です)。
一方、「参照渡し」とは、
参照渡しによるコピーや受け渡しでは、実際に作成されるのは元の項目へのポインタですが、そのポインタを、あたかもコピーされた項目であるかのように扱うことになります。この場合は、元の項目に変更を加えると、元の項目とコピーされた項目の両方が変更されます (逆の場合も同様です)。実際存在する項目は 1 つだけで、"コピーされた項目" は、データへのもう 1 つの参照に過ぎません。
と説明されている。 そしてJScript の文字列の場合は
文字列の場合は、コピーや受け渡しは参照渡しで行われますが、比較は値渡しで行われます。
となっている。つまり JScriptにおいて 「=」を用いて 文字列変数に文字列変数を代入したとしても それは、元の文字列へのポインタがひとつ増えただけであり、 実際に存在する文字列はひとつしかないわけである。 そのため、今回 追加した一行は全くの無駄ということになってしまう。

【参考リンク】

カテゴリー: プログラミング     2006年10月14日 22:33

トラックバック

このエントリーのトラックバックURL:
http://www.skymerica.com/blog/yotsumoto/mt/mt-tb.cgi/587


コメント

コメントしてください




保存しますか?


 
ハワイ島での遊覧飛行ツアーとB&Bのスペシャリスト、スカイメリカ
Copyright © 2003,2009 Skymerica Corp. All rights reserved.