日記「芦」

科学における最初の教訓─跳ぶ前に見よ(レン・フィッシャー著「魂の重さは何グラム?」より) 画像フォルダ - HTA 2011/8/20(Sat.)
 PCの画像フォルダは放っておいたらサイズが何ギガにもなって行く。
別に、新しくUSBメモリなりを買い足せば解決するんだけど、そもそも画像
フォルダはいかなる時に必要か。画像そのものを後からまた見たい、という
根本的で単純な欲求はあまり無かったりする。そういうのはごく一部で、
大多数は何となく良い画像だから保存しただけで、例えば壁紙画像なんて
ほとんどはたぶん二度と壁紙として利用しない。
 また量が多いと後で必要になった画像を探すのにも手間がかかる。でき
れば必要最小限であって欲しいと思う。

それで一枚ずつ表示させて必要かどうかを考えて一々削除してくわけだが、
これもやはり手間であるし、あんまり量が多いんで途中から吐き気を催すし、
それよりも、削除基準が自分の中で変わっていくのだ。これが一番恐ろしい。
それはつまり、一枚ずつ見てるからいけないのだ。後半はさっき見たのと
比較を頭の中でするので削除が慎重になってくように思われる。

そこで、4枚いっぺんに表示して、その中で要らないの1枚を必ず選んで削除
する、というスクリプトを書いてみた。スクリプト自体は大したことないけど、
まあ、Shell.Applicationて初めて使ったのでそれの練習だと思うことにする。

---
 初めに画像フォルダのディレクトリをpromptで聞いて、その直下にある
ファイルを画像だと勝手に思うことにしてで表示する。4つ。
(本当はランダムにするべきなんだろうけど、配列のshuffle()なんて
標準で無いし、だから順番になってる。)
 4つの内削除したいのをひとつクリックしたら、確認も無しに、削除して
次の4つを表示する。ユーザーはこれを繰り返す。
 4つ全部どうしても削除したくない、と思ったらゲームオーバー。諦めて
画像をクリックしちゃわないように気をつけてウィンドウを閉じるコト。

---
<title>delete 1/4 of images</title>
<script>
var dir=prompt("ディレクトリ","C:\\Users\\owner\\Pictures");
var Fso,App,Fld,children,files,cx,H;

function init(){
	Fso=new ActiveXObject("Scripting.FileSystemObject");
	App=new ActiveXObject("Shell.Application");
	Fld=App.NameSpace(dir);
	children=Fld.Items();
	files=[];
	for(var i=0;i<children.Count;i++){
		if(!children.Item(i).IsFolder)files.push(children.Item(i).Name);
	}
	cx=0;
	H=document.body.clientHeight-10;
	disp();
}

function del_(name){
	Fso.DeleteFile(dir+"\\"+name,true);
}

function disp(){
	document.body.innerHTML="";
	Z=document.createElement("nobr");
	for(var j=0;j<4;j++,cx++){
		X=document.createElement("img");
		X.src=dir+"\\"+files[cx];
		X.height=H;
		X.style.margin="0";
		X.onclick=function(x){
			return function(){del_(x);if(cx<files.length)disp();}
		}(files[cx])
		Z.appendChild(X);
	}
	document.body.appendChild(Z);
}
</script>
<body onload="init()" style="margin:0;"> 

---
追記1
ちょっと考えたら配列のシャッフルなんて簡単じゃん。
Array.prototype.shuffle=function(){
	return this.sort(function(){return Math.random()-.5})
};
alert([1,2,3,4,5,6,7].shuffle());

---
追記2
感想としては、並べられた4枚をその場で相対的にランク付けして、最低の
ものを削除することになるから、1枚ずつ表示してたら削除しないような
モノでも削除しちゃう。ちょっと後で勿体無かったかなって思うのもあった
けど。

 改良した。4枚じゃなくて3枚並べることにした。その方が一目で見やすい
し、フォルダのサイズが2/3くらいに軽くしたかったから。

 間違えて削除しちゃったのもいくつかあったので、画像をダブルクリックで
削除することにした。後、どうしても削除したくない時は右クリックで
削除せずに次の3枚を表示する。
 それからファイルの順は上の「追記1」を利用してシャッフルしてる。

<title>lite to 2/3</title>
<script>
var dir=prompt("ディレクトリ","C:\\Users\\owner\\Pictures");
var Fso,App,Fld,children,files,cx,H;
var ID;

function init(){
	Fso=new ActiveXObject("Scripting.FileSystemObject");
	App=new ActiveXObject("Shell.Application");
	Fld=App.NameSpace(dir);
	children=Fld.Items();
	files=[];
	for(var i=0;i<children.Count;i++){
		if(!children.Item(i).IsFolder)files.push(children.Item(i).Name);
	}
	files=files.sort(function(){return Math.random()-.5})
	files=files.sort(function(){return Math.random()-.5})
	
	cx=0;
	H=document.body.clientHeight-10;
	disp();
}

function del_(name){
	document.title+=" - "+name+" 削除"
	Fso.DeleteFile(dir+"\\"+name,true);
	ID=setTimeout(function(){document.title="delete 1/4 of images";},1000);
}

function disp(){
	document.body.innerHTML="";
	Z=document.createElement("nobr");
	for(var j=0;j<3;j++,cx++){
		X=document.createElement("img");
		X.src=dir+"\\"+files[cx];
		X.height=H;
		X.style.margin="0";
		X.ondblclick=function(x){
			return function(){del_(x);if(cx<files.length)disp();}
		}(files[cx])
		Z.appendChild(X);
	}
	document.body.appendChild(Z);
}
</script>
<body onload="init()" style="margin:0;" oncontextmenu="disp();return false">


コメ(0) | トラ(0)