PicoMiteのファイル管理コマンド

# はじめに

PicoCalcはファイルを保存する場所としてRaspberry Pi Pico内のフラッシュメモリのフラッシュファイルシステム（Aドライブ）とSDカードファイルシステム（Bドライブ）の2つがある。
PicoMiteおよびWebMiteのコマンドプロンプトおよびMMBasicのプログラムからファイルやディレクトリを操作するコマンドを確認した。

# ドライブ操作コマンド DRIVE

## アクティブドライブの変更

アクティブドライブは`DRIVE drive$`コマンドで設定します。PicoMiteおよびWebMite
の起動直後はフラッシュファイルシステムのAドライブがアクティブドライブです。

`DRIVEコ`マンドのパラメータ`drive\$`は`"A:"`または`"B:"`、あるいは文字型変数です。
アクティブドライブをSDカードのBドライブに変更するコマンドを以下に示します。

```
> DRIVE "B:"
> B:
> PRINT MM.INFO$(DRIVE)
B:
```

- A:、B:は`DRIVE "A:"`、`DRIVE "B:"`のショートカットとして定義されています。
- `MM.INFO$(DRIVE)`はアクティブドライブを返す定義済み読み取り専用変数で、値の表示には`PRINT`文を使います。

## ドライブAのフォーマット

フラッシュファイルシステム（Aドライブ）は`DRIVE "A:/FORMAT`コマンドで再フォーマットできます。SDカードファイルシステム（Bドライブ）のフォーマットはできませんでした。

```
> FILES
A:/
   <DIR>  .
   <DIR>  ..
   <DIR>  test
19:35 28-05-2025        297  ADT7410.bas
19:23 28-05-2025          4  bootcount
3 directories, 2 files, 2195456 bytes free
> DRIVE “A:/FORMAT”
> FILES
A:/
   <DIR>  .
   <DIR>  ..
19:37 28-05-2025          4  bootcount
2 directories, 1 file, 2207744 bytes free
> DRIVE "B:/FORMAT"
Error : Syntax
```

ファイル`bootcount`はPicoMiteおよびWebMiteを起動した回数を保存しているファイルでフォーマットするとリセットされます。次のコマンドで起動回数を確認できます。

```
> PRINT MM.INFO(boot count)
4
```



## アクティブドライブの表示

アクティブドライブは`MM.INFO$(DRIVE)`定義済み読み取り専用変数で取得できます。`PRINT`文を使って表示できます。

```
> PRINT MM.INFO$(DRIVE)
A:
```

## アクティブドライブの空き容量取得

アクティブドライブの空き容量は`MM.INFO(FREE SPACE)`定義済み読み取り専用変数で取得できます。容量はバイト単位です。初回のSDカードの容量取得には少し時間がかかりました。

```
> PRINT MM.INFO(FREE SPACE)
 2207744
> B:
> PRINT MM.INFO(FREE SPACE)
 31629066240
> PRINT MM.INFO(FREE SPACE)/1024^3  <- GB単位に換算
 29.4568634
```

## アクティブドライブの容量取得

アクティブドライブの容量は`MM.INFO(DISK SIZE)`定義済み読み取り専用変数で取得できます。容量はバイト単位です。

```
> PRINT MM.INFO(disk size)
 2215936
> B:
> PRINT MM.INFO(disk size)
 31669338112
> PRINT MM.INFO(disk size)^3
 29.49436951
```

# ディレクトリ操作

PicoMiteおよびWebMiteではmacOSなどと同様にディレクトリの作成・削除、カレントディレクトリの変更コマンドが用意されています。

## ディレクトリ作成コマンド MKDIR

ディレクトリ作成は`MKDIR dir$`コマンドを使います。パラメータ`dir$`に作成するディレクトリの文字列あるいはティレクトリ名を格納した文字型変数を指定します。

```
> A:
> MKDIR "TEST
> MKDIR "test
> files
A:/
   <DIR>  .
   <DIR>  ..
   <DIR>  TEST
   <DIR>  test
（略）
> B:
> MKDIR "TEST
> MKDIR "test
Error : Access denied due to prohibited access
```

フラッシュファイルシステムは大文字・小文字を区別するのでディレクトリTESTが存在していてもディレクトリtestを作成できますがSDカードファイルシステムは大文字・小文字を区別しないためディレクトリTESTが存在するとディレクトリtestは作成できません。

作成するディレクトリ名を文字型変数に代入し、それをコマンドのパラメータにてディレクトリを作成できます。

```
> dd$="src"
> MKDIR dd$
> files
B:/
   <DIR>  firmware
   <DIR>  src
   <DIR>  TEST
（略）
```

アクティブドライブ以外にはディレクトリは作成できません。

```
> MKDIR "A:/TEST
Error : Only valid on current drive
```

## ディレクトリの削除コマンド RMDIR

ディレクトリの削除は`RMDIR dir$`コマンドを使います。コマンドのパラメータ`dir$`に削除するディレクトリ名の文字列か削除するディレクトリ名を格納した文字型変数を指定します。
削除できるのは空のディレクトリのみで、削除対象のディレクトリにファイルやディレクトリが存在する場合は削除できません。あらかじめ後述する`KILL`コマンドで削除するディレクトリ内のファイルを削除する必要があります。

```
> RMDIR "TEST"
> RMDIR "test"
Error : Dir is not empty
```

## カレントディレクトリの変更コマンド CHDIR

カレントディレクトリの変更は`CHDIR dir$`コマンドを使います。コマンドのパラメータ`dir$`に変更先のディレクトリ名の文字列か変更先のディレクトリ名を格納した文字型変数を指定します。
アクティブドライブのディレクトリTESTに変更する場合は次のように実行します。

```
> CHDIR "TEST"
> FILES
A:/TEST
   <DIR>  .
   <DIR>  ..
2 directories, 0 files, 2179072 bytes free
```

ルートディレクトリは`/`または`\`を、親ディレクトリは`..`を使って指定できます。

```
> CHDIR "TEST"
> MKDIR "/A"
> FILES "/"
A:/
   <DIR>  .
   <DIR>  ..
   <DIR>  A
   <DIR>  TEST
   <DIR>  test
（略）
```

## カレントディレクトリ名の取得関数 CWD$

カレントディレクトリ名の取得には`CWD$`関数を使います。コマンドプロンプトで表示したい場合は`PRINT`コマンドを使います。

```
> PRINT CWD$
/
> CHDIR "TEST"
> PRINT CWD$
A:/TEST
```

# ファイル操作

## ファイル一覧表示コマンド FILES

カレントディレクトリやドライブのファイルを表示するには`FILES [fspec$] [,sort]`コマンドを使います。パラメータを省略した場合はカレントディレクトリのファイル一覧を表示します。

```
FILES
A:/
   <DIR>  .
   <DIR>  ..
   <DIR>  A
   <DIR>  TEST
   <DIR>  test
21:04 28-05-2025        297  a.bas
21:00 28-05-2025        297  ADT7410.bas
19:37 28-05-2025          4  bootcount
5 directories, 3 files, 2170880 bytes free
```

パラメータ`fspec$`にはワイルドカードによるパターン指定ができます。二つ目のパラメータ`sort`は一覧表示時の並べ替えを指定できます。
ワイルドカードは任意の一文字を示す？、任意の文字列に一致する＊を使用できます。

注：`FILES`コマンドはコマンドプロンプトでのみ使用でき、プログラム内では使用できません。

### BASICのソースファイルのみ表示

SDカードファイルシステム（Bドライブ）のルートディレクトリのBASICソースファイル（拡張子.BAS）のみを表示したい場合は`fspec$`パラメータに`B:/*.bas`を指定します。実行例を示します。

```
> FILES "B:/*.bas"
B:/
15:41 28-05-2025        297  ADT7410.bas
19:02 27-05-2025         87  ASCIIcodeTable.bas
07:20 25-02-2025        423  bifdiag.bas
21:58 25-05-2025       1205  hat.bas
22:02 25-05-2025        624  List6-3.bas
07:22 25-02-2025        550  lorenz.bas
10:42 06-01-2025        847  mand.bas
21:13 25-05-2025        425  scr.bas
20:07 27-05-2025        133  SetFNKy.bas
0 directories, 9 files
```

### ファイル名が4文字のBASICファイルの表示

一文字のワイルドカード？を4つ並べて任意の4文字のファイル名（`????.bas`）を指定します。

```
> FILES "B:/????.bas
B:/
10:42 06-01-2025        847  mand.bas
0 directories, 1 file
```

### ファイル一覧の並べ替え

  一覧表示時のファイル一覧の並べ替えのパラメータ`sort`をファイル名指定に続けて指定できます。指定できるのは下記の4つです。
  
- size：ファイルサイズを昇順で並べ替え
- time：日時を降順で並べ替え
- name：ファイル名順に並べ替え
- type：ファイル拡張子別

#### BASICのソースをサイズの小さい順に表示

`size`パラメータを指定するとファイルサイズ順で一覧表示されます。実行例を示します。

```
> FILES "B:/*.bas", size
B:/
19:02 27-05-2025         87  ASCIIcodeTable.bas
20:07 27-05-2025        133  SetFNKy.bas
15:41 28-05-2025        297  ADT7410.bas
07:20 25-02-2025        423  bifdiag.bas
21:13 25-05-2025        425  scr.bas
07:22 25-02-2025        550  lorenz.bas
22:02 25-05-2025        624  List6-3.bas
10:42 06-01-2025        847  mand.bas
21:58 25-05-2025       1205  hat.bas
0 directories, 9 files
```

#### BASICのソースを新しい順に表示

`time`パラメータを指定するとファイルのタイムスタンプの新しい順に表示されます。実行例を示します。

```
> FILES "B:/*.bas", time
B:/
15:41 28-05-2025        297  ADT7410.bas
20:07 27-05-2025        133  SetFNKy.bas
19:02 27-05-2025         87  ASCIIcodeTable.bas
22:02 25-05-2025        624  List6-3.bas
21:58 25-05-2025       1205  hat.bas
21:13 25-05-2025        425  scr.bas
07:22 25-02-2025        550  lorenz.bas
07:20 25-02-2025        423  bifdiag.bas
10:42 06-01-2025        847  mand.bas
0 directories, 9 files
```

#### BASICソースを名前順に表示

`name`パラメータを指定すると名前順に表示されます。これはデフォルトのパラメータです。実行例を示します。

```
> FILES "B:/*.bas", name
B:/
15:41 28-05-2025        297  ADT7410.bas
19:02 27-05-2025         87  ASCIIcodeTable.bas
07:20 25-02-2025        423  bifdiag.bas
21:58 25-05-2025       1205  hat.bas
22:02 25-05-2025        624  List6-3.bas
07:22 25-02-2025        550  lorenz.bas
10:42 06-01-2025        847  mand.bas
21:13 25-05-2025        425  scr.bas
20:07 27-05-2025        133  SetFNKy.bas
0 directories, 9 files
```

#### SDカードファイルシステム（Bドライブ）をファイルの種別ごとに表示

`type`パラメータを指定するとファイルの種別順に一覧表示されます。実行例を示します。

```
> FILES "B:/", type
B:/
   <DIR>  TEST
   <DIR>  src
   <DIR>  firmware
15:41 28-05-2025        297  ADT7410.bas
21:58 25-05-2025       1205  hat.bas
21:13 25-05-2025        425  scr.bas
22:02 25-05-2025        624  List6-3.bas
19:02 27-05-2025         87  ASCIIcodeTable.bas
20:07 27-05-2025        133  SetFNKy.bas
07:20 25-02-2025        423  bifdiag.bas
07:22 25-02-2025        550  lorenz.bas
10:42 06-01-2025        847  mand.bas
21:16 25-05-2025     306294  memory.bmp
00:01 01-01-2024     307254  boot.bmp
14:20 27-05-2025     307254  List6-3.bmp
12:29 13-01-2025     307254  picocalc.bmp
10:42 06-01-2025    2133632  BellLabs_Fine.mp3
10:42 06-01-2025      40976  Chessnovice_johnybot.nes
3 directories, 15 files
```

## ファイル名の変更コマンド RENAME

ファイル名を変更するには`RENAME fromname$ AS tonane$`コマンドを使います。fromname\$からtoname\$に名前を変更します。ファイル名は文字列、あるいは文字型変数を指定します。

以下にアクティブドライブのファイルa.basの名前をb.basに変更する例です。

```
> FILES "*.bas"
A:/
22:45 28-05-2025        297  a.bas
21:00 28-05-2025        297  ADT7410.ba
s
0 directories, 2 files, 2166784 bytes free
> RENAME "a.bas" AS "b.bas"
> FILES "*.bas"
A:/
21:00 28-05-2025        297  ADT7410.bas
22:45 28-05-2025        297  b.bas
0 directories, 2 files, 2166784 bytes free
```

ディレクトリの名前も変更できます。ディレクトリAをTEMPという名前に変更する場合は次のようにコマンドを入力します。

```
> RENAME "A" AS "TEMP"
```

名前を変更できるのはアクティブドライブ内のみです。非アクティブドライブに対しては操作できません。下記の例のように現在のドライブのみが有効である旨のメッセージが表示されます。

```
> RENAME "B:/a.bas" AS "B:/B.bas"
Error : Only valid on current drive
```

## ファイルコピーコマンド COPY

ファイルをコピーするときは`COPY fromname$ TO toname$`コマンドを使います。fromname\$からtoname\$へコピーします。ファイル名は文字列、あるいは文字型変数を指定します。

ファイルをディレクトリへコピーする場合はワイルドカードでファイル名を指定した場合のみ可能で完全なファイル名でのコピーはエラーになる。

以下はBASICのファイルをディレクトリTESTへコピーする例です。
ディレクトリのファイル一覧はディレクトリ名の末尾に/を付ける（例：TEST/）。

```
> COPY "*.bas" TO "TEST"
Copying ADT7410.bas
Copying a.bas
Copying b.bas
> FILES "TEST/"
A:/TEST
   <DIR>  .
   <DIR>  ..
09:17 29-05-2025        297  a.bas
09:17 29-05-2025        297  ADT7410.bas
09:17 29-05-2025        297  b.bas
2 directories, 3 files, 2154496 bytes free
> COPY "a.bas" TO "TEST"
Error : No space left on device
```

コピー先ディレクトリの同名のファイルが有る場合は上書きされます。

アクティブドライブ以外のドライブにファイルをコピーするときはドライブ名を含めた完全なパス名を指定する（同じ名前でコピーしたい場合もファイル名を指定する）。
以下はアクティブドライブ（Aドライブ）のファイルADT7410.basをSDカードファイルシステムのディレクトリTESTへコピーする例を示します。

```
> COPY "ADT7410.bas" TO "B:/TEST/ADT7410.bas"
> FILES "B:/TEST/"
B:/TEST
09:28 29-05-2025        297  ADT7410.bas
0 directories, 1 file
```

## ファイルの削除コマンド KILL

ファイルを削除するときは`KILL file$ [,all]`コマンドを使います。パラメータ`file$`に削除したいファイル名の文字列あるいはファイル名を格納した文字型変数を指定します。

```
> KILL "b.bas"
```

ワイルドカードを使っている場合は削除するか否かの確認をしながら実行されます。

```
> KILL "TEST/*"
Deleting ADT7410.bas ? (Y/N) Y
Deleting a.bas ? (Y/N) Y
Deleting b.bas ? (Y/N) Y
```

パラメータ`all`を指定した場合、1回だけ削除するかの確認があり、Yと回答すると連続してファイルを削除します。

```
> KILL "TEST/*.bas", all
Deleting *.bas from A:/TEST
Are you sure ? (Y/N) Y
Deleting ADT7410.bas
Deleting a.bas
```

アクティブドライブ以外のドライブのファイルを削除する場合はファイルコピーの場合と同様に完全なパス名を指定する。

```
> KILL "B:/src/ADT7410.bas"
```

# 参考サイトなど

- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)