2017年2月22日水曜日

[UWSC]ファイル操作の関数 [自作関数]

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
今回は、今回は、ファイル操作を行うための関数をいくつか作りました。

記事の内容

○ファイル操作の関数
戻値(str)=chk_path(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)

スマホで閲覧されている方へ
このブログは画面横幅を広くしてあります。スマホ解像度での閲覧は厳しいと思いますので、ウェブバージョンへどうぞ。

せっかくコンピュータで処理しているわけですから、結果を残したり、前回の設定を読み込んだり色々したいわけです。でも、開発環境によってファイル操作に関しての命令が異なります。

というわけで、自分が使っている他の環境と同じ仕様となるようUWSCでのファイル操作を関数としてまとめておきます。(テキストファイルが対象です。)


省略パスを修正するchk_path()関数

関数の仕様として、ファイル名のみ指定された場合は.exeと同じフォルダ内を指定されたものとすることにします。そのために一つ関数を準備しておきます。
chk_path()関数
1
2
3
4
5
6
7
8
9
10
FUNCTION chk_path(path)
   //   ファイル名だけ渡された場合は
   //   実行ファイルのある場所(GET_CUR_DIR)に変換する
         IF (left(path,2)="\\")//ネットワークフォルダ指定された
         ELSEIF (keyword(path,":\")=1)//フルパス指定された
         ELSE
            path=GET_CUR_DIR+"\"+path
         ENDIF
            RESULT=path
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,10行目1
10
FUNCTION chk_path(path)
FEND
chk_path(path)関数宣言:引数pathとしてファイル名だけ渡された場合に、実行ファイル(.exe)のあるフォルダと同じ位置のパスに修正して返す関数。
4~6,8行目4
5
6
8
         IF (left(path,2)="\\")//ネットワークフォルダ指定された
         ELSEIF (keyword(path,":\")=1)//フルパス指定された
         ELSE
         ENDIF
ネットワークフォルダが指定された、引数path中に":\"が存在した(←C:\windowsなどのハードディスクを示す記号。)場合は、
 ⇒ 何もしない
それ以外の場合は、7行目を実行。

5行目:keyword(path,":\")はこちら→[UWSC]文字列中の指定のキーワードありなし判定する関数で作成した自作関数。
7行目7            path=GET_CUR_DIR+"\"+path
引数pathを書き換える。
GET_CUR_DIRはUSWCの特殊変数。実行ファイルのパスが入っています。
9行目9            RESULT=path
条件によっては書き換えられた引数pathを戻り値として返します。



ファイルの有無を調べるfile_exists()関数

ファイルが無いのに開けと命令してしまうとエラーが出てプログラムが止まってしまいます。そのため、ファイルが存在するかどうかは頻繁に調べますので、ファイルの存在を調べる関数を準備します。
file_exists()関数
1
2
3
4
5
6
7
8
FUNCTION file_exists(path)
            path=chk_path(path)
         IF (FOPEN(path,F_EXISTS)=1)
            RESULT=1
         ELSE
            RESULT=0
         ENDIF
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,8行目1
8
FUNCTION file_exists(path)
FEND
file_exists(path)関数宣言:引数pathとして渡されたファイルが存在するかどうかを調べる関数。(ただの翻訳関数です。)
存在した  :1を返す。
存在しない :0を返す。
2行目2            path=chk_path(path)
↑で作成した関数に引数pathを渡し引数を修正します。
3,5,7行目3
5
7
         IF (FOPEN(path,F_EXISTS)=1)
         ELSE
         ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 4行目を実行
×⇒ (存在しなかった) 6行目を実行

FOPEN(パス,F_EXISTS)は、パスで指定されたファイルがある場合は1、無い場合は0を返すUWSC標準関数です。
4行目4            RESULT=1
" RESULT=1"
6行目6            RESULT=0
" RESULT=0"



ファイルを削除するfile_del()関数

ファイルを削除する関数です。削除するファイルのパスを引数として渡して指定します。
file_del()関数
1
2
3
4
5
6
7
8
9
10
FUNCTION file_del(path)
            path=chk_path(path)
         IF (FOPEN(path,F_EXISTS)=1)
            comm="del "+path
            DOSCMD(comm)
            RESULT=1
         ELSE
            RESULT=0
         ENDIF
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,10行目1
10
FUNCTION file_del(path)
FEND
file_del(path)関数宣言:引数pathとして渡されたファイルを削除する関数。
成功した場合は1を返し、ファイルが無かった場合は0を返します。
2行目2            path=chk_path(path)
↑で作成した関数に引数pathを渡し引数を修正します。
3,7,9行目3
7
9
         IF (FOPEN(path,F_EXISTS)=1)
         ELSE
         ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 4~6行目を実行
×⇒ (存在しなかった) 8行目を実行

敢えて↑で作成したfile_exists()関数は使用していません。
4~6行目4
5
6
            comm="del "+path
            DOSCMD(comm)
            RESULT=1
ファイルの削除はDOS窓の機能を利用します。"del パス"というコマンドをDOS窓に与えるとファイルを削除します。

4行目: 変数commを定義して、"del "という文言を変数pathの前に付けます。これはDOSコマンドを作っています。
5行目: 作成したコマンドをDOS窓へ与えます。DOSCMD(コマンド)はDOS窓にコマンドを渡せというUWSCの命令です。
6行目: 関数の戻り値として、1を返します。
8行目8            RESULT=0
関数の戻り値として0を返します。




ファイルに書込を行うfile_save()関数

ファイルに書き込みを行う関数です。引数としてパス、書き込むデータ、モード番号を渡す仕様としました。モード番号で上書きモードと追記モードを選択します。
file_save()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FUNCTION file_save(path,dt,mode)//mode=0:上書き、=1:追加
            path=chk_path(path)
         SELECT mode
         CASE 0
            file=FOPEN(path,F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
         CASE 1
   //   FOPEN()関数には、読み書き両用モード(F_READ OR F_WRITE)
   //   このモードで書き込み行と書き込み列を省略して書き込みすると、
   //   末尾に改行+書き込み。
            file=FOPEN(path,F_READ or F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
         SELEND
            RESULT=1
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,17行目1
17
FUNCTION file_save(path,dt,mode)//mode=0:上書き、=1:追加
FEND
file_save(path,dt,mode)関数宣言:データをテキストファイルに書き込む関数。
引数path :ファイルのパス
引数dt  :書き込むデータ
引数mode :0:上書きモード、1:追記モード
2行目2            path=chk_path(path)
↑で作成した関数に引数pathを渡し引数を修正します。
3~4,8,15行目3
4
8
15
         SELECT mode
         CASE 0
         CASE 1
         SELEND
変数modeの値により分岐します。
(変数mode=0:上書きモードなら) ⇒ 5~7行目を実行。
(変数mode=1:追記モードなら) ⇒ 12~14行目を実行。
5~7行目5
6
7
            file=FOPEN(path,F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
以下はUWSCの命令。
FOPEN(パス,F_WRITE1)(←※)は、パスで指定されたファイルを書き込みモードで開く。戻り値はファイルID。ファイルが存在しない場合は作成します。
FPUT(ファイルID,データ)は、指定されたファイルIDにデータを上書きする命令。
FCLOSE(ファイルID)は、ファイルを閉じる命令。
FOPEN(パス,F_WRITE)を使用してましたが、F_WRITE1(SJIS用)に修正。文字列変数を書き込む際に文字化けするため。(2017年7月22日修正)
12~14行目12
13
14
            file=FOPEN(path,F_READ or F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
以下はUWSCの命令。
FOPEN(パス,F_READ or F_WRITE1)(←※)は、パスで指定されたファイルを読み書きモードで開く。ファイルIDが帰ってきます。ファイルが存在しない場合は作成します。
FOPEN(パス,F_WRITE)を使用してましたが、F_WRITE1(SJIS用)に修正。文字列変数を書き込む際に文字化けするため。(2017年7月22日修正)
16行目16            RESULT=1
関数の戻り値として1を返します。



ファイルから読み込むfile_load()関数

ファイルの中身を読み込むための関数。読み込み方は、テキストファイルの各行を配列変数に代入してそれを返す仕様としました。例えば、10行目の内容は配列[9]に代入されて帰ってきます。ソースの2~6行目に使い方がコメントアウトで書かれています。
file_load()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FUNCTION file_load(path)
//           呼び出し側ソース
//            fdt=path("ファイルパス")
//            先頭行=fdt[0]
//            最終行=fdt[ubound(fdt)]
//   n行目に書かれているデータは呼び出し側配列fdt[n-1]に入る
            path=chk_path(path)
      IF (FOPEN(path,F_EXISTS)=1)
            file=FOPEN(path,F_READ)
            n=FGET(file,F_LINECOUNT)
            DIM read[n-1]
         FOR i=0 TO n-1
            read[i]=FGET(file,i+1,1)
         NEXT
            FCLOSE(file)
      ELSE
            DIM read[0]
            read[0]="ファイルが見つかりません。"
      ENDIF
            RESULT=SLICE(read,0,length(read)-1)
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,21行目1
21
FUNCTION file_load(path)
FEND
file_load(path)関数宣言:テキストファイルからデータを読み込んで配列に代入して返す関数。
引数path :ファイルのパス

呼び出し側は3行目のコメントにある方法で呼び出します。配列変数の見方は4~6行目。
7行目7            path=chk_path(path)
↑で作成した関数に引数pathを渡し引数を修正します。
8,16,19行目8
16
19
      IF (FOPEN(path,F_EXISTS)=1)
      ELSE
      ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 9~15行目を実行
×⇒ (存在しなかった) 17、18行目を実行

敢えて↑で作成したfile_exists()関数は使用していません。
9~15行目9
10
11
12
13
14
15
            file=FOPEN(path,F_READ)
            n=FGET(file,F_LINECOUNT)
            DIM read[n-1]
         FOR i=0 TO n-1
            read[i]=FGET(file,i+1,1)
         NEXT
            FCLOSE(file)
以下はUWSCの命令。
FOPEN(パス,F_READ)は、パスで指定されたファイルを読み込みモードで開く。戻り値はファイルID。
FGET(ファイルID,F_LINCOUT)は、指定されたファイルが何行あるかを返す関数。FGET(ファイルID,N1,N2)とすると、N1行目からN2行分のデータを返します。ファイルの1行目がN1=1です。
FCLOSE(ファイルID)は、ファイルを閉じる命令。

9行目: ファイルIDを得ます。
10行目: 変数nに全部で何行あるかを代入します。
11行目; 配列変数read[]を行数分定義します。
12~14行目: 配列変数read[]にファイルの1行づつ代入していきます。
15行目: ファイルを閉じます。
17,18行目17
18
            DIM read[0]
            read[0]="ファイルが見つかりません。"
ファイルが存在しなかったので、配列の要素0番にその由を代入して返します。
20行目20            RESULT=SLICE(read,0,length(read)-1)
関数の戻り値として配列変数を返します。



記事の内容

記事の内容は伝わりましたでしょうか。
○ファイル操作の関数
戻値(str)=chk_path(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)


【関連記事】
[UWSC]関数の定義と呼び出し方[使い方まとめ]
[UWSC]高圧縮jpegと劣化なしのbmp画像を取得する関数
[UWSC]現在のタイムスタンプ(文字列)を返す関数
[UWSC]iniファイルを扱う関数


スポンサーリンク



↓ ランキングに参加しています!(Ctrlキーを押しながら) ↓

blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
電気回路やプログラムの記事。元々のメインコンテンツ。
UWSC奮闘記
プログラミングのできる子に
デジタルの世界って
映画・ドラマ・芸能
ハリウッドが主のエンターテイメントの記事。最近は似顔絵多し。
戦士の息抜き
ブログ運営
AnalyticsやSerchConsolなどの使い方、アクセスアップに関する話題。
アドセンス関連
他のGoogleツール
その他
アホのもくろみ
アホの雑記
取りとめもなく好き勝手に書く記事。不本意にも一番人気だったり。
役に立つかも
休むに似たり
好き勝手に書く
落書き漫画
何故人気なのか全く解らない数コマ漫画。結局最大コンテンツに。
物思いに耽る
免責事項 ホームへ戻る

スポンサーリンク





0 件のコメント:

コメントを投稿