2013年2月13日水曜日

簡易ファイラー

簡易ファイラーです。ファイルおよびディレクトリの一覧表示と削除ができます。

ユーザーがプログラムで作成したファイルは、プログラム内で削除しない限り内部に残り続けるので、不要なファイルを削除できるように作りました。

ただし、削除可能なのはユーザーが作成したプログラム以外のファイルだけです。
プログラムは、選択リスト上から削除できます。
画面の都合上、iPad縦画面専用です(手抜き)。

//------------------------------------------------
/* ファイルの一覧表示と削除を行うプログラム
/*  サンプルのようでいて、実は実用プログラムである
/* File list display and delete program
/* This is sample program and this is practical program actually.
//------------------------------------------------
// for X-BASIC for iOS v2.1

// 初期化 / initialize
font("IPAGothic")
int fzenhan
int WX=64:if deviceType()<>1 then WX=48
int WY=width(WX,,fzenhan)
int xw=1:/* 全角1文字の桁数 / zenkaku 1 character columus
if fzenhan then xw=2

// タッチキー位置 / touch key area
int tx=WX-20:// <WX/2にすること
int ty=3
//
// 画面作成 / screen make
int lns=20:// 表示行数 / display lines
if lns>=WY-2 then lns=WY-2
makeScreen()
//
// 全ファイルリストを得る / get all file list
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
str ext="":// 全ファイルを示す拡張子 / extension for all files
//
// 初期ファイル検索 / initial file search
int top:// 表示している先頭行要素番号:fileList(top)
  // 表示範囲は(top)〜(top+lns-1)
int cur:// カーソル位置:0〜lns-1
searchFiles(ext)
tcolor(-THWHITE,0,0,255)
int page=0
int fafterMessage=NO
//
repeat
 int top0=top,cur0=cur
 int fdel=NO
 str ext0=ext
 //
 int ky=inkey()
 switch ky
  // カーソル移動 / cursor move
  case '8'
   // カーソル上 / cursor up
   if fafterMessage then messageDisp("")
   if cur=0 then {
    if top>0 then top=top-1
   } else {
    cur=cur-1
   }
   break
  case '2'
   // カーソル下 / cursor down
   if fafterMessage then messageDisp("")
   if cur=lns-1 then {
    if top+lns<allcnt then top=top+1
   } else {
    if top+cur<allcnt-1 then cur=cur+1
   }
   break
  // ページ単位移動 / page move
  case '4'
   // 前ページ / prev. page
   if fafterMessage then messageDisp("")
   if allcnt>lns then {
    // ページ切り替えが可能なとき / When paging is enabled
    top=top-(lns-1):// 1行残す / left 1 line
    if top<0 then top=0 else page=page-1
   }
   break
  case '6'
   // 次ページ / next page
   if fafterMessage then messageDisp("")
   if allcnt>lns then {
    // ページ切り替えが可能なとき / When paging is enabled
    top=top+(lns-1):// 1行残す / left 1 line
    if top+lns>allcnt then {
     top=allcnt-lns
    } else {
     page=page+1
    }
   }
   break

  // 削除 / delete
  case 'd'
   if fafterMessage then messageDisp("")
   allcnt=allcnt-1
   str fname=fileList(top+cur)
   int ret
   str title$,errmes$
   dim str mn$(1)
   if isLocalizeJapan() then {
    mn$(0)="いいえ"
    mn$(1)="はい"
   } else {
    mn$(0)="NO"
    mn$(1)="YES"
   }
   if fname[strlen(fname)-1]='/' then {
    // ディレクトリだったとき
    if isLocalizeJapan() then {
     title$="このディレクトリを削除しますか?"
     errmes$="削除できません(空でない)"
    } else {
     title$="Delete this directory ?"
     errmes$="Can't delete(Not empty)"
    }
    if selectMenu(title$,mn$)=1 then {
     // ただし、空ディレクトリでないと削除できない
     if rmdir(fname)=0 then {
      fdel=YES:// 表示も変更が必要
     } else {
      messageDisp(errmes$+":"+fname)
     }
    }
   } else {
    // ファイルだった時
    if isLocalizeJapan() then {
     title$="このファイルを削除しますか?"+chr$(DISP_CTRL_LF)+fname
     errmes$="削除できません"
    } else {
     title$="Delete this file ?"
     errmes$="Can't delete"
    }
    if pathExtension(fname)="bas" then {
     // .basファイルは消せないようにしておく(プログラムを削除するのはプログラム選択メニューから)
     // Disable to delete .bas file (if you will do, do in program select menu)
     messageDisp(errmes$+"(.bas):"+fname)
     break
    }
    if selectMenu(title$,mn$)=1 then {
     if fdelete(fname)=0 then {
      fdel=YES:// 表示も変更が必要
     } else {
      messageDisp(errmes$+":"+fname)
     }
    }
   }
   break

  // 拡張子変更 / change extension
  case 'j'
   if fafterMessage then messageDisp("")
   ext="jpg"
   break
  case 'p'
   if fafterMessage then messageDisp("")
   ext="png"
   break
  case 'a'
   if fafterMessage then messageDisp("")
   ext=""
   break

  default
   break
 endswitch
 if ext<>ext0 or fdel=YES then {
  // 拡張子変更 / extension changed
  // またはファイルの数が変わった / Or the number of files is changed
  // ファイルの再検索をするが、このページの先頭は変更しなくても良い
  int top1=top
  int cur1=cur
  searchFiles(ext)
  if top1+cur1>=allcnt then {
   if cur1>0 then cur=cur1-1:// 一番後ろを消したときは、1つ上に上げる。でもそれが最上行を消すものなら、前ページに移動する・・・のは大変なので、最初から表示しなおし
  } else {
   // 新しいページにまだ収まるとき
   top=top1
   cur=cur1
  }
  // ページは変わらないけど、再表示は必要
  printList()
 }
 if top<>top0 then {
  // ページが変わる / page changed
  printList()
  fdel=NO
 } else {
  if cur<>cur0 then {
   // カーソル位置が変わった / cursor moved
   printList1(cur0) // 元の位置を反転解除 / non-reverse old position
   printList1(cur)  // 新しい位置を反転 / revese new position
  }
 }
until ky='!'
end

//------------------------------------------------
// 関数 / functions
//------------------------------------------------

func printKeys(x;int,y;int)
     //  012345678901 *2
 locate(x,y+0):print "┏━┓┏━┓┏━┓┏━┓"
 locate(x,y+1):print "┃←┃┃↑┃┃↓┃┃→┃"
 locate(x,y+2):print "┗━┛┗━┛┗━┛┗━┛"
endfunc

func makeScreen()
 // タッチキー / touch key
 dim int touchNo(10) :// タッチエリア番号 / touch area number
 int touchallcnt  :// タッチエリア数   / the number of touch area
 //
 int x=0
 int y=1+lns+1
 printKeys(x,y)

 int i=0
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 0),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'4',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'8',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+12),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'2',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+18),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'6',YES,  125,0,5,100)
 touchallcnt=i

 // ファンクションキー / fucntion key
 str exit$,ext$,prev$,next$,del$
 if isLocalizeJapan() then {
  exit$="終了"
  ext$="全て"
  prev$="前頁"
  next$="後頁"
  del$="削除"
 } else {
  exit$="exit"
  ext$="all"
  prev$="Prev"
  next$="Next"
  del$="Del"
 }
 setFunctionKey(0,prev$,'4')
 setFunctionKey(1,next$,'6')
 setFunctionKey(2,"   ",'?')
 setFunctionKey(3,del$ ,'d')
 setFunctionKey(4,"   ",'?')
 setFunctionKey(5,"jpg",'j')
 setFunctionKey(6,"png",'p')
 setFunctionKey(7,ext$ ,'a')
 setFunctionKey(8,"   ",'?')
 setFunctionKey(9,exit$,'!')

 setFunctionKeyBackgroundImage("funcBack.png")
 displayFunctionKeyAll(YES,YES):// v2.0
endfunc

func messageDisp(mes;str)
 locate(0,lns+1)
 if len(mes)=0 then {
  print chr$(DISP_CTRL_CLEARLINE) 
  fafterMessage=NO:// メッセージ表示してない / Message is not displaying
 } else {
  print mes
  fafterMessage=YES:// メッセージ表示中 / Now message is displaying
 }
endfunc

//------------------------------------------------

func printList1(i;int)
// 1行表示 / 1line display
 locate(0,1+i)
 if i=cur then tatrb(ATRB_REVERSE):// 選択行 / selected line
 if top+i<allcnt then {
  print using "###:";top+i;
  print fileList(top+i);
 // print lastPathComponent(fileList(top+i));
  if i=cur then tatrb(ATRB_NORMAL)
 }
 print chr$(DISP_CTRL_CLEARLINE):// 行末まで消す / clear to end of line
endfunc

func printList()
// 画面内表示 / display in screen
 int i
 int max=lns
 for i=0 to max-1
  printList1(i)
 next
 locate(WX-10,0):print "page=";page
endfunc

func searchFiles(ext;str)
 // 新しく表示し直すので各種ポインターをリセット
 top=0 :// 表示している先頭行要素番号:fileList(top)
    // 表示範囲は(top)〜(top+lns-1)
 cur=0 :// カーソル位置:0〜lns-1
 //
 allcnt=files(fileList,"",ext,YES,FILES_ALL)
 cls()
 printKeys(0,1+lns+1)
 //
 locate(0,0)
 if isLocalizeJapan() then {
  print "拡張子=";ext,,
  print "ファイル数=";allcnt
 } else {
  print "extension=";ext,,
  print allcnt;" files"
 }
 printList()
endfunc

//------------------------------------------------


Zipファイル :XBetc.zip

0 件のコメント:

コメントを投稿