page top
Contents ::
ホーム 画像の加工 LOTO6の研究 K2食品認定委員会 北区の散歩 Q珈琲(新琴似店) サル・サルーサ おばかTube 農園ギャラリー おすすめリンク ダウンロードコーナー
K2_UTY.pl K2_DAY.pl K2_MTH.pl K2_IMG.pl k2_TAG.pl K2_FIL.pl k2_SUB.pl



package k2;

;# -----------------------------------------------------------------------------
;# K2/LIB::PERL LIBRARY++                                                      .
;#                                                                             .
;#       File Dir Control Library                                              .
;#                                                                             .
;#                             All Right Reserved, CopyRight (C) 2008 by Dr.K  .
;# -----------------------------------------------------------------------------


;#//////////////////////////////////////////////////////////////////////////////
;# Perl Package Module Import
;#//////////////////////////////////////////////////////////////////////////////
 #use strict;
 use Cwd;
 use Switch;
 use Time::Local;
 use Fcntl;
 use File::Find;
 use File::Copy;
 #require 'K2_UTY.pl';
;#//////////////////////////////////////////////////////////////////////////////


;#//////////////////////////////////////////////////////////////////////////////
;# Prototype
;#//////////////////////////////////////////////////////////////////////////////
;# ファイル関数 x 8
;# DirSize($dir, \@siz)
;# FileSize($fl, \@siz)
;# FilesInDir($dir, \@fl)
;# FilesInDir1($dir, \@fl)
;# DirsInDir($dir, $dirs)
;# FilesMatch($match, \@fl)
;# FileDateTime($sw, $fl)
;# FileLastSave($fl)

;# ファイルパス要素取得 x 6
;# _cutoff_Path($pth)
;# ExtractFilePath($pth)
;# ExtractFileName($pth)
;# ExtractFileExt($pth)
;# ExtractFileOnly($pth)
;# ChangeFileExt($pth, $ext)

;# ファイル判定 x 4
;# isExistsDir($dir)
;# isExistsFile($fl)
;# isWriteFile($fl)
;# isFileOf($ext, $fl);

;# ファイル操作 x 11
;# CurrDir($dir)
;# MakeDir($dir)
;# DeleDir($dir)
;# DeleFile($fl)
;# EraseFile($fl)
;# RemoveDir($dir)
;# RenameDir($old, $new)
;# RenameFile($old, $new)
;# Permission($fl, $Permission)
;# getPermission($fl)
;# setPermission($fl, $Permission)

;# ファイルの読込保存 x 5
;# SaveFile($fl, @dat)
;# LoadFile($fl, $@dat)
;# AppendFile($fl, @dt)
;# CopyFile($f0, $f1, $pm)
;# MoveFile($f0, $f1);

;# CSVファイルの読込保存 x 2
;# LoadCSV($fl, \@dat)
;# SaveCSV($fl, @dat)

;# レコード単位のファイル管理 x 7
;# SaveLine($fl, $no, $dt)
;# LoadLine($fl, $no, \@dat)
;# SearchHitLine($fl, $key, \@dat)
;# SearchNextLine($fl, $key, $no, \@dat)
;# SearchAllLine($fl, $key, \@dat)
;# SpaceLine($fl)
;# LastLine($lf)

;# INIファイル管理 x 5
;# iniRead($ini, $section, $ident, $value)
;# iniWrite($ini, $section, $ident, $value)
;# iniReadAll($ini, $section, @value)
;# iniWriteAll($ini, $section, \@value)
;# iniRemove($ini, $section, $ident)

;# INI形式のデータベース x 6
;# def_Separat()
;# def_Save()
;# def_Load()
;# def_Edit()
;# def_Search()
;# def_Remove()

;# Total = 54
;#//////////////////////////////////////////////////////////////////////////////


;#///////////////////////////////////y///////////////////////////////////////////
;# ファイル関数
;#//////////////////////////////////////////////////////////////////////////////


# フォルダのサイズ取得
# '$sw = 1::Byte, $sw = 2::KB'
# '$siz'(リファレンス)があれば戻り値を代入
sub DirSize{
	my ($dir, $sw, $siz) = @_;

	$$siz = 0;
	$sw = MinMax($sw, 1, 2);
	if(isExistsFile($dir)){
		find(sub {$$siz += -s if -f}, $dir);
		$$siz = ($sw == 2) ? Ceil($$siz / 1024) : $$siz;
	}
	return($$siz);
}

# ファイルのサイズ取得
# '$sw = 1::Byte, $sw = 2::KB'
# '$siz'(リファレンス)があれば戻り値を代入
sub FileSize{
	my ($fl, $sw, $siz) = @_;

	$$siz = 0;
	$sw = MinMax($sw, 1, 2);
	if(isExistsFile($fl)){
		$$siz = (-s $fl);
		$$siz = ($sw == 2) ? Ceil($$siz / 1024) : $$siz;
	}
	return($$siz);
}

# フォルダ内のファイル取得
# '$fl'(リファレンス)があれば戻り値を代入
sub FilesInDir{
	my ($dir, $fl) = @_;

	@$fl = ();
	if(RightStr($dir, 1) ne '/'){
		$dir .= '/';
	}
	if(isExistsDir($dir)){
		if(opendir(DP, "$dir")){
			foreach(readdir(DP)){
				next if($_ =~ /^\.{1,2}$/);
				push(@$fl, $_)if(isExistsFile($dir.$_));
			}
			closedir(DP);
		}
	}
	return(@$fl);
}

# フォルダ配下のファイル取得
# '$fl'(リファレンス)があれば戻り値を代入
sub FilesInDir1{
	my ($dir, $fl, $sw) = @_;

	@$fl = ();
	if(RightStr($dir, 1) ne '/'){
		$dir .= '/';
	}
	if(isExistsDir($dir)){
		#find(@$fl, $dir);
		if(opendir(DP, $dir)){
			foreach(grep(!/^\.+/, readdir(DP))){
				if(-d "$dir/$_"){FilesInDir1("$dir$_", \@$fl, 1); next}
				if($sw){
					unshift(@$fl, "$dir$_");
				}else{
					push(@$fl, "$dir$_");
				}
			}
			closedir(DP);
		}
	}
	return(@$fl);
}

# フォルダ内のディレクトリ取得
# '$dirs'(リファレンス)があれば戻り値を代入
sub DirsInDir{
	my ($dir, $dirs) = @_;
	@$dirs = ();
	if(RightStr($dir, 1) ne '/'){
		$dir .= '/';
	}
	if(isExistsDir($dir)){
		if(opendir(DP, $dir)){
			foreach(readdir(DP)){
				next if($_ =~ /^\.{1,2}$/);
				push(@$dirs, $_)if(isExistsDir($dir.$_));
			}
			closedir(DP);
		}
	}
	return(@$dirs);
}

# ワイルドカードでファイル取得(./*.txt)
# '$fl'(リファレンス)があれば戻り値を代入
sub FilesMatch{
	my ($match, $fl) = @_;
	@$fl = glob($match);
	return(@$fl);
}

# 更新日時の取得
sub FileDateTime{
	my ($sw, $fl) = @_;

	my $ret = '0';
	if(isExistsFile($fl)){
		my @tm = stat($fl);
		@tm = localtime(timelocal(localtime($tm[9])));
		if($sw){
			$ret = sprintf("%4d/%02d/%02d %02d:%02d:%02d",
					$tm[5] + 1900, $tm[4] + 1, $tm[3], $tm[2], $tm[1], $tm[0]);
		}else{
			$ret = sprintf("%4d%02d%02d%02d%02d%02d",
					$tm[5] + 1900, $tm[4] + 1, $tm[3], $tm[2], $tm[1], $tm[0]);
		}
	}
	return($ret);
}

# 最終更新からの経過日数を取得
sub FileLastSave{
	my ($fl) = @_;
	my $ret = (isExistsFile($fl)) ? (-M $fl) : 0;
	return($ret);
}


;#//////////////////////////////////////////////////////////////////////////////
;# ファイルパス要素取得
;#//////////////////////////////////////////////////////////////////////////////


# パスの分離(内部関数)
sub _cutoff_Path{
	my ($pth) = @_;

	my ($dir, $fil, $fnm, $ext);
	if($pth =~ /(.*)\/(.*)/){
		$dir = $1.'/';
		$fil = $2;
	}else{
		$dir = './';
		$fil = $pth;
	}

	if($fil =~ /(.*)\.(.*)/){
		$fnm = $1;
		$ext = $2;
	}else{
		$fnm = $fil;
		$ext = "";
	}
	return($dir, $fnm, $ext);
}

# ディレクトリ名の取得
sub ExtractFilePath{
	my ($pth) = @_;
	my ($dir, $fnm, $ext) = _cutoff_Path($pth);
	return($dir);
}

#ファイル名の取得
sub ExtractFileName{
	my ($pth) = @_;
	my ($dir, $fnm, $ext) = _cutoff_Path($pth);
	return($fnm);
}

# 拡張子名の取得
sub ExtractFileExt{
	my ($pth) = @_;
	my ($dir, $fnm, $ext) = _cutoff_Path($pth);
	return($ext);
}

#ファイル名のみの取得
sub ExtractFileOnly{
	my ($pth) = @_;
	my $ext = ExtractFileExt($pth);
	$pth = ($ext) ? ExtractFileName($pth).'.'.$ext : '';
	return($pth);
}

# 拡張子名の変更
sub ChangeFileExt{
	my ($fl, $ext) = @_;
	$fl = ExtractFilePath($fl).ExtractFileName($fl).$ext;
	return($fl);
}


;#//////////////////////////////////////////////////////////////////////////////
;# ファイル判定
;#//////////////////////////////////////////////////////////////////////////////


# フォルダの存在確認
sub isExistsDir{
	my ($dir) = @_;
	my $ret = (-d $dir) ? 1 : 0;
	return($ret)
}

# ファイルの存在確認
sub isExistsFile{
	my ($fl) = @_;
	my $ret = (-e $fl) ? 1 : 0;
	return($ret)
}

# ファイルの書込確認
sub isWriteFile{
	my ($fl) = @_;
	my $ret = (-w $fl) ? 1 : 0;
	return($ret)
}

# 拡張子名の判定
# $ext = 'jpg,gif'
# $fl = ファイル名
sub isFileOf{
	my ($ext, $fl) = @_;
	$fl = ExtractFileExt(lc($fl));
	my @ext = split(/,/, lc(TrimA($ext)));
	my $ret = (HitOf($fl, @ext) >= 0) ? 1 : 0;
	return($ret);
}


;#//////////////////////////////////////////////////////////////////////////////
;# ファイル操作
;#//////////////////////////////////////////////////////////////////////////////


# カレントディレクトリの変更と取得
# '$dir'があれば変更、無ければ返す
sub CurrDir{
	my ($dir) = @_;

	my $ret = '0';
	if($dir){
		$ret = chdir($dir);
	}else{
		$ret = Cwd::getcwd();
	}
	return($ret);
}

# フォルダの作成
sub MakeDir{
	my ($dir) = @_;

	my $ret = 0;
	unless(isExistsDir($dir)){
		umask(0);
		$ret = mkdir("$dir", 0755);
	}
	return($ret);
}

# フォルダの削除
sub DeleDir{
	my ($dir) = @_;

	my $ret = 0;
	if(isExistsDir($dir)){
		$ret = rmdir($dir);
	}
	return($ret);
}

# ファイルの削除
sub DeleFile{
	my ($fl) = @_;

	my $ret = 0;
	if(isExistsFile($fl)){
		$ret = unlink($fl);
	}
	return($ret);
}

# ワイルドカードの指定ファイル削除
# $fl=ファイル名(ワイルドカード)
sub EraseFile{
	my($fl) = @_;

	if(ExtractFileExt($fl)){
		my @file;
		FilesMatch($fl, \@file);
		foreach(@file){k2::DeleFile($_)}
		return(1);
	}else{
		return(0);
	}
}

# フォルダと内部ファイルの削除
sub RemoveDir{
	my($dir) = @_;

	if(opendir(FP, $dir)){
		my @FL = readdir(FP);
		close FP;
		foreach(@FL){
			if($_ =~ /^\.{1,2}$/){
				if(-d "$dir/$_"){
					deletedir("$dir/$_");
				} else {
					unlink("$dir/$_");
				}
			}
		}
		rmdir($dir);
		return(1);
	}else{
		return(0);
	}
}

# フォルダのリネーム
sub RenameDir{
	my ($old, $new) = @_;

	my $ret = 0;
	if(isExistsDir($old) && !isExistsDir($old)){
		$ret = rename[$old], [$new];
	}
	return($ret);
}

# ファイルのリネーム
sub RenameFile{
	my ($old, $new) = @_;

	my $ret = 0;
	if(isExistsFile($old) && !isExistsFile($old)){
		$ret = rename[$old], [$new];
	}
	return($ret);
}

# パーミッションの取得設定
sub Permission{
	my ($fl, $pm) = @_;

	if($pm){
		return(setPermission($fl, $pm));
	}else{
		return(getPermission($fl));
	}
}

# パーミッションの取得
sub getPermission{
	my ($fl) = @_;

	my $ret = '0';
	if(isExistsFile($fl)){
		my @st = stat "$fl";
		my $pm = substr((sprintf "%03o", $st[2]), -3);
		$ret = $pm;
	}
	return($ret);
}

# パーミッションの設定
sub setPermission{
	my ($fl, $Permission) = @_;

	if(isExistsFile($fl) && $Permission){
		$Permission = RightStr('0000' + $Permission, 4);
		chmod(eval($Permission), $fl);
		return(1);
	}else{
		return(0);
	}
}


;#//////////////////////////////////////////////////////////////////////////////
;# ファイルの読込保存
;#//////////////////////////////////////////////////////////////////////////////


# ファイルの読込
# '$dat'(リファレンス)があれば戻り値を代入
sub LoadFile{
	my ($fl, $dat) = @_;

	@$dat = ();
	if(isExistsFile($fl)){
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			@$dat = <FP>;
		close(FP);
		OmitRetLastEx(\@$dat);
	}
	return(@$dat);
}

# ファイルの新規保存
sub SaveFile{
	my ($fl, @dat) = @_;

	if(isExistsFile($fl)){
		DeleFile($fl);
	}
	unless(open(FP, ">$fl")){return(0)}
	unless(Lock0(FP, 2)){return(-1)}
		foreach(@dat){
			print FP "$_\n";
		}
	close(FP);
	return(1);
}

# ファイルの追加保存
sub AppendFile{
	my ($fl, @dt) = @_;

	unless(isExistsFile($fl)){
		$ret = SaveFile($fl, @dt);
	}else{
		unless(open(FP, ">>$fl")){return(0)}
		unless(Lock0(FP, 2)){return(-1)}
			foreach(@dt){
				print FP "$_\n";
			}
		close(FP);
	}
	return(1);
}

# ファイルのコピー(パーミッション付)
# パーミッションを指定しなければコピー元と同じ
sub CopyFile{
	my ($f0, $f1, $pm) = @_;

	if(isExistsFile($f0) && !isExistsFile($f1)){
		!(-e "$f0") && return(0);       # File Not Found
		!(copy($f0, $f1)) && return(0); # Failure Copy
		if($pm){Permission($f1, $pm)}
		return(1);
	}else{
		return(0);
	}
}

# ファイルの移動
sub MoveFile{
	my ($f0, $f1) = @_;

	if(isExistsFile($f0) && !isExistsFile($f1)){
		if(move($f0, $f1)){
			return(1);
		}else{
			return(0);
		}
	}else{
		return(0);
	}
}


;#//////////////////////////////////////////////////////////////////////////////
;# ファイルロック
;#//////////////////////////////////////////////////////////////////////////////


# ファイルロック0
# $no=(1: load, 2: save)
sub Lock0{
	my ($FP, $no) = @_;

	my $ok = eval{flock(FP, $no);};
	if(defined($ok)){
		return(1);
	}else{
		return(0);
	}
}

# ファイルロック1
sub Lock1{
	my ($lock_fl) = @_;

	my $try = 5;
	while(!symlink(".", $lock_fl)){
		if(--$try <= 0){
			last;
		}
		sleep(1);
	}
}

# ファイルロック2
sub Lock2{
	my ($lock_fl) = @_;

	foreach(1..5){
		if(-e $lock_fl){
			sleep(1);
		}else{
			open(LOCK, ">$lock_fl");
			close(LOCK);
			return(1);
		}
	}
}

# ファイルロック解除
sub unLock{
	DeleFile($lock_fl);
}


;#//////////////////////////////////////////////////////////////////////////////
;# CSVファイル
;#//////////////////////////////////////////////////////////////////////////////


# CSVファイルの読込
# '$dat'(リファレンス)がある場合代入される
sub LoadCSV{
	my ($fl, $dat) = @_;

	@$dat = ();
	if(isExistsFile($fl)){
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			foreach(<FP>){
				my @val = Csv2Array($_);
				push(@$dat, [@val]);
			}
		close(FP);
	}
	return(@$dat);
}

# CSVファイルの保存
sub SaveCSV{
	my ($fl, @dat) = @_;

	if(isExistsFile($fl)){
		DeleFile($fl);
	}
	unless(open(FP, ">$fl")){return(0)}
	unless(Lock0(FP, 2)){return(-1)}
		foreach(@dat){
			my $val = join(',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @dat);
			print FP "$val\n";
		}
	close(FP);
	return(1);
}


;#//////////////////////////////////////////////////////////////////////////////
;# K2::FDBI
;# レコード単位のファイル管理  + 自作データベース機能
;# 少し関数を追加すれば大規模データベースとして利用可能
;# テーブル管理を作成すれば自作DBがチョー簡単に作成出来る
;#//////////////////////////////////////////////////////////////////////////////


# ファイルの行指定読込
# 最初のレコードは'$no=1'
# '$dat'(リファレンス)があれデータが代入される
sub LoadLine{
	my ($fl, $no, $dat) = @_;

	my $ret = '';
	if(isExistsFile($fl)){
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			while(<FP>){
				if($. == $no){
					$ret = $_;
					last;
				}
			}
		close(FP);
	}
	$$dat = $ret;
	return($ret);
}

# ファイルの行指定保存
# 区切りデータ又はテーブルでデータベースとして利用可能
# レコードのバイト数は一定、'$no=0' はレコード新規追加(空白レコードがあれば使用)
sub SaveLine{
	my ($fl, $no, $dt) = @_;

	my ($pt, $ln, $fg);
	if(isExistsFile($fl)){
		unless(open(FP, "+<$fl")){return(0)}
		unless(Lock0(FP, 2)){return(-1)}
			unless($no){
				$no = 1;
				$fg = 1;
			}
			while(<FP>){
				if($. == $no){
					$pt = tell(FP) - length($_);
					$ln = length($_) - 1;
					last;
				}
			}
			if($ln){
				unless($fg){
					$dt = Text2MaxLenW($dt, $ln, 1);
					seek(FP, $pt, 0);
					print FP "$dt\n";
				}
			}
		close(FP);

        if($fg){
			$fg = 0;
			unless(open(FP, "+<$fl")){return(0)}
			unless(Lock0(FP, 2)){return(-1)}
				while(<FP>){
					$ln = length($_) - 1;
					unless(Trim($_)){
						$dt = _LineData($dt, $ln);
						seek(FP, -length($_), 1);
						print FP "$dt\n";
						last;
					}
				}
				unless($fg){
					$dt = Text2MaxLenW($dt, $ln, 1);
					print FP "$dt\n";
				}
			close(FP);
		}
	}else{
        $ret = SaveFile($fl, $dt);
	}
	return(1);
}

# キー検索(First Hit)
# 最初にヒットしたデータのみが返る
# '$dat'(リファレンス)があればヒットしたデータが代入される
sub SearchHitLine{
	my ($fl, $key, $dat) = @_;

	$$dat = '';
	if(isExistsFile($fl)){
		$key = cnv2sjis($key);
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			foreach(<FP>){
				if(index($_, $key) >= 0){
					$$dat = $_;
					last;
				}
			}
		close(FP);
	}
	return($$dat);
}

# Nextキー検索
# '$no'の次にヒットしたデータが返る
# '$ret' = レコード番号,データ(コンマ区切り)
# '$dat'(リファレンス)があればヒットしたデータが代入される
sub SearchNextLine{
	my ($fl, $key, $no, $dat) = @_;

	unless($no){$no = 0}
	$$dat = '';

	if(isExistsFile($fl)){
		$key = cnv2sjis($key);
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			my $ct = 0;
			foreach(<FP>){
				$ct++;
				if($ct > $no){
					if(index($_, $key) >= 0){
						$$dat = $ct.','.$_;
						last;
					}
				}
			}
		close(FP);
	}
	return($$dat);
}

# 連続キー検索
# '$dat' はリファレンス
# ヒットしたレコード番号が全て返る
sub SearchAllLine{
	my ($fl, $key, $dat) = @_;

	my ($ret, $pt) = (0, 0);
	if(isExistsFile($fl)){
		my $ct = 0;
		$key = cnv2sjis($key);
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			foreach(<FP>){
				$ct++;
				if(index($_, $key) >= 0){
					$dat->[$pt] = $ct;
					#$dat->[$pt][0] = $ct;
					#$dat->[$pt][1] = $_;
					$pt++;
				}
			}
		close(FP);
	}
	return($pt);
}

# 空白レコードの取得
sub SpaceLine{
	my ($fl) = @_;

	my $ret = 0;
	if(isExistsFile($fl)){
		unless(open(FP, "<$fl")){return(0)}
		unless(Lock0(FP, 1)){return(-1)}
			while(<FP>){
				unless(Trim($_)){
					$ret = $.;
					last;
				}
			}
		close(FP);
	}
	return($ret);
}

# 最終レコード番号の取得
# 現在何データあるか調べる
# 1レコードは必ずあるという前提
sub LastLine{
	my ($fl) = @_;

	my $ct = 0;
	unless(open(FP, "<$fl")){return(0)}
	unless(Lock0(FP, 1)){return(-1)}
		seek(FP, 0, 1);
		my $ln = length(<FP>);
		seek(FP, 0, 2);
		if($ln){$ct = int(tell(FP) / $ln)};
	close(FP);
	return($ct);
}


;#//////////////////////////////////////////////////////////////////////////////
;# K2::INIDBI
;# INIファイル管理 + データベース機能
;# $ident, $value に2バイト文字が使用できる!!
;# 下記の関数を駆使すれば十分に小規模なDBとして使用出来る♪
;#//////////////////////////////////////////////////////////////////////////////


;#------------------------------------------------------------------------------
;#
;# ※ファイルの構造
;# ファイルの内部は以下の様な構造になっている
;#
;#    INIファイル
;#    $ini = ファイル名('setup.ini')
;#    ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
;#    [OPTION] ← $section(漢字も可)
;#    Size=100
;#    好み=秋刀魚 ← $value
;#      ↑
;#     $ident
;#       :
;#       :
;#    EOF
;#    ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
;#
;#------------------------------------------------------------------------------


# iniFile読込
# '$value' はデフォルト値
# '$ini, $section, $ident'どれが無くとも値が返ってくる
sub iniRead{
	my ($ini, $section, $ident, $value) = @_;

	my $ret = ($value) ? $value : '';
	if($ini && $section && $ident){
		if(isExistsFile($ini)){
			my @dat = ();
			unless(open(FP, "<$ini")){return(0)}
			unless(Lock0(FP, 1)){return(-1)}
				@dat = <FP>;
			close(FP);
			OmitRetLastEx(\@dat);

			$ident .= '=';
			my $pt = HitOf('['.$section.']', @dat);

			if($pt >= 0){
				for(my $i = $pt + 1; $i < @dat; $i++){
					unless(LeftStrW($dat[$i], 1) eq '['){
                    	if($dat[$i] =~ /$ident/i){
							($a, $ret) = split(/=/,$dat[$i]);
							$ret = TrimS($ret);
							last;
						}
					}else{
						last;
					}
                }
			}
		}
	}
	return($ret);
}

# iniFile保存
# 全ての引数が揃ってなくてはダメ
sub iniWrite{
	my ($ini, $section, $ident, $value) = @_;

	my $ret = 0;
	if($ini && $section && $ident && $value){
		my @dat = ();
		$ident .= '=';
		$section = '['.$section.']';

		if(isExistsFile($ini)){
			unless(open(FP, "<$ini")){return(0)}
			unless(Lock0(FP, 1)){return(-1)}
				@dat = <FP>;
			close(FP);
			OmitRetLastEx(\@dat);

			my ($pt, $ed, $fg);
			$pt = HitOf($section, @dat);

			if($pt >= 0){
				$value = TrimS($value);
				for(my $i = $pt + 1; $i < @dat; $i++){
					$ed = $i;
					unless(LeftStrW($dat[$i], 1) eq '['){
						if($dat[$i] =~ /$ident/i){
							$dat[$i] = $ident.$value;
							$fg = 1;
							last;
						}
					}else{
						last;
					}
				}
				unless($fg){
					$ed = ($ed == $#dat) ? $ed + 1 : $ed;
					InsertOf(\@dat, $ed, $ident.$value);
				}
			}else{
                $dat[@dat] = $section;
                $dat[@dat] = $ident.$value;
			}
		}else{
            $dat[@dat] = $section;
            $dat[@dat] = $ident.$value;
		}
		$ret = SaveFile($ini, @dat);
	}
	return($ret);
}

# '$section' を全て読込む
# '$value' はリファレンス
# '$ident' は無し、もし必要なら "@value('name=たろう', 'age=35')" とする
sub iniReadAll{
	my ($ini, $section, $value) = @_;

	my $ret = 0;
	if($ini && $section){
		if(isExistsFile($ini)){
			my @dat = ();

			unless(open(FP, "<$ini")){return(0)}
			unless(Lock0(FP, 1)){return(-1)}
				@dat = <FP>;
			close(FP);
			OmitRetLastEx(\@dat);

			my $pt = HitOf('['.$section.']', @dat);

			if($pt >= 0){
				my $ct = 0;
				for(my $i = $pt + 1; $i < @dat; $i++){
					unless(LeftStrW($dat[$i], 1) eq '['){
						$value->[$ct] = TrimS($dat[$i]);
						$ret = 1;
						$ct++;
					}else{
						last;
					}
				}
			}
		}
	}
	return($ret);
}

# '$section' に全て保存
# '$section' は全て入れ替わる
sub iniWriteAll{
	my ($ini, $section, @value) = @_;

	my $ret = 0;
	if($ini && $section){
		my @dat = ();

		if(isExistsFile($ini)){
			iniRemove($ini, $section);

			unless(open(FP, "<$ini")){return(0)}
			unless(Lock0(FP, 1)){return(-1)}
				@dat = <FP>;
			close(FP);
			OmitRetLastEx(\@dat);
		}

		$dat[@dat] = '['.$section.']';
		foreach(@value){
			$dat[@dat] = TrimS($_);
		}

		$ret = SaveFile($ini, @dat);
	}
	return($ret);
}

# iniFileの要素削除
# '$section'は必須引数
# '$ident'がある場合は'$ident'の削除
# '$ident'がない場合は$sectionごと削除
sub iniRemove{
	my ($ini, $section, $ident) = @_;

	my $ret = 0;
	if($ini && $section){
		if(isExistsFile($ini)){
			my @dat = ();
			unless(open(FP, "<$ini")){return(0)}
			unless(Lock0(FP, 1)){return(-1)}
				@dat = <FP>;
			close(FP);
			OmitRetLastEx(\@dat);

			my ($pt, $fg);
			$pt = HitOf('['.$section.']', @dat);

			if($pt >= 0){
				if($ident){
					$ident .= '=';
				}else{
					$dat[$pt] = '';
				}
				for(my $i = $pt + 1; $i < @dat; $i++){
					unless(LeftStrW($dat[$i], 1) eq '['){
						if($ident){
							if($dat[$i] =~ /$ident/i){
								$dat[$i] = '';
								$fg = 1;
								last;
							}
						}else{
							$dat[$i] = '';
							$fg = 1;
						}
					}else{
                        last;
					}
				}

				if($fg){
                    my @buf = ();
                    foreach(@dat){
                        if($_){$buf[@buf] = $_}
                    }
                    $ret = SaveFile($ini, @buf);
				}
			}
		}
	}
	return($ret);
}

## K2/LIBPERL LIBRARY++ ------------------------------------------------------
1;                                                      ## Presented by Dr.k2 ##
## EOF -------------------------------------------------------------------------