Rubyのシンタックス勉強用（組み込みクラス Fileクラス、Dirクラス）の挙動 [RUBY技術者認定試験...問題45,46,47,48,94,95,96,97,98]

# 基本説明

- Fileクラス：ファイル名の変更やコピーや削除、ファイル情報の取得などの機能がある
- Dirクラス：ディレクトリ情報の取得、ディレクトリ中のファイル一覧、ディレクトリの作成や削除の機能がある

## 組み込みクラス Fileクラス

### File#dirname

File#dirnameは、最後のスラッシュの左側を文字列として返します。文字列にスラッシュがない場合は`.`を返します。

```rb
p File.dirname('/hoge/fuga/test.txt') # => "/hoge/fuga"
p File.dirname('$LIB') # => "."
```

（RUBY技術者認定試験...問題45）

### ファイルの読み書き

#### File.openのモード | `r+` | 読み書き両方 / ファイルの読み書き位置は**先頭**にセット

`r`は読み出しだけ

![8693cd3f4de29193df3c6aa6832cce92.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/537748a5-5e97-4043-d113-5a317e1299ef.gif)

#### File.openのモード | `w+` | 読み書き両方 / オープン時にファイルがあれば内容を空にする

`w`は書き込みだけ、あとは同じ

![6fb74a2a064eb24b3785a942f35fe396.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/923e9cd3-e952-c590-5c57-dfce10ba8f58.gif)

#### File.openのモード | `a+` | 読み書き両方 / オープン時にファイルがあれば、ファイルの読み書き位置は**末尾**にセット

`a`は書き込みだけ、あとは同じ

![bee1554676ac80603da8aff99e52dd50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/4cbcabf3-cdbe-fb7d-4138-884902a5675b.gif)

（RUBY技術者認定試験...問題46）

#### RUBY技術者認定試験...問題47

以下のコードの実行結果は？的な問題があります。

```rb
File.open('foo.txt') do |io|
  while ! io.eof?      # ファイルの終端に達した場合、true / そうでない場合 false
    print io.read(1)         # 読み込む
    io.seek(1, IO::SEEK_CUR) # 現在の位置から1文字移動
  end
end
``` 

![7511a9882fb90527abc2d318cfc32236.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/a5bc4d4a-e6b4-0202-9387-1989b267552e.gif)

```rb
# => 結果 acdfhjlnprtvxz
```

#### RUBY技術者認定試験...問題95

以下のコードの実行結果は？

```rb
file = File.open('foo.txt')
file.seek(2)     # ファイルポインタの位置が先頭から2バイト移動する
print file.gets  # 1行読み込んで表示
```

![b5d5d0dbc763a2bd307134814696aa7b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/ff672812-be06-3c98-39c5-02c2fd552eac.gif)

```rb
# => 結果 cd
```

#### RUBY技術者認定試験...問題96

![96_rb_—_ruby_silver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/4e279587-3ef1-7561-cf32-529bdb2e17b2.png)

選択肢

```txt
- 1. gets
- 2. readline
- 3. readlines
- 4. read
```

ファイルを1行ずつ読み込むメソッドでお馴染みなのは `gets` と `readline` です。両者の違いは、終端に達した時の挙動です。

- gets：これ以上読む行がない時は nil を返す
- readline：これ以上読む行がない時は 例外（EOFError） を返す

問題を見ると、レスキューでキャッチしているので、正解は2ですね。

#### RUBY技術者認定試験...問題97

![97_rb_—_ruby_silver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/68edb8f6-bad6-c5af-bc12-e08588dbcdbc.png)

以下の結果になるメソッドは？

選択肢

```txt
- 1. concat
- 2. add
- 3. join
- 4. create_path
```

正解は3なのですが、Fileクラスのメソッド `join` は、パス名の区切り文字（`/`）を間に入れて文字列を連結します。URLを作成するときに使用します。

## 組み込みクラス Dirクラス

カレントディレクトリ内の、特定のワイルドカードに一致するファイルの一覧を取得して表示するコードを2パターン書きます。

```rb
files = Dir.glob("*.rb")
# files = Dir["*.rb"]

files.each{ |file| p file }
```

```rb
# files = Dir.glob("*.rb")
files = Dir["*.rb"]

files.each{ |file| p file }
```

![7f6be2b811ed340ef6d63de27e4092c1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/f433926e-551a-5389-6819-734b29472738.gif)

（RUBY技術者認定試験...問題48）

#### RUBY技術者認定試験...問題98

この中で、Dirクラスのクラスメソッドでないものは？

```rb
- 1. Dir.rmdir
- 2. Dir.basename
- 3. Dir.pwd
- 4. Dir.extname
- 5. Dir.getwd
```

正解（Dirクラスのクラスメソッドでないもの）は、`2`、`4`です。この２つは、Fileクラスのメソッドです。

```rb
filename = '/hoge/fuga/test.txt'
p File.basename(filename)         # => "test.txt"
p File.basename(filename, '.txt') # => "test"
p File.dirname(filename)          # => "/hoge/fuga"
p File.extname(filename)          # => ".txt"
p File.split(filename)            # => ["/hoge/fuga", "test.txt"]
```

# 実行結果は以下でサクッと試せます

[Online Ruby Editor and IDE \- Fast, Powerful, Free \- Repl\.it](https://repl.it/languages/ruby)

# 参考

- 日経BP SHOP｜Ruby技術者認定試験 公式ガイド https://shop.nikkeibp.co.jp/front/commodity/0000/181950/
- class IO (Ruby 2.6.0) https://docs.ruby-lang.org/ja/latest/class/IO.html#I_EOF