nimファイル操作

# 概要
nimのファイル操作関連処理をコツコツと書いていく予定
## 以下メモ
### テキストをファイルに書き込む
```nim
import os,times
block:
  var f : File = open("members.txt" ,FileMode.fmWrite)
  defer :
    close(f)
    echo "closed"
  f.writeLine "Mr.スポック"
  f.writeLine "Mr.ビーン"
```
```
(stdout)
closed
```
### テキストファイルを読み込む
```nim
import os,times
block:
  var f : File = open("members.txt" , FileMode.fmRead)
  defer :
    close(f)
    echo "closed"
  echo f.readLine()
  echo f.readLine()
  #echo f.readLine()
```
```
(stdout)
Mr.スポック
Mr.ビーン
closed
```
### テキストファイルをEOFまで読み込む
```nim
import os,times
block:
  var f : File = open("members.txt" , FileMode.fmRead)
  defer :
    close(f)
    echo "closed"
  while f.endOfFile == false :
    echo f.readLine()
  #echo f.readLine()
```
```
(stdout)
Mr.スポック
Mr.ビーン
closed
```
### テキストファイルをすべて読み込む
```nim
import os,times
block:
  var f : File = open("members.txt" , FileMode.fmRead)
  defer :
    close(f)
    echo "closed"
  echo f.readAll()
  #echo f.readLine()
```
```
(stdout)
Mr.スポック
Mr.ビーン

closed
```
### ファイルサイズを取得する
```nim
import os,times
block:
  var f : File = open("members.txt")
  defer :
    close(f)
    echo "closed"
  echo f.getFileSize
  # こちらでも同じ
  echo getFileSize("members.txt")
  echo "members.txt".getFileSize()
```
```
(stdout)
29
29
29
closed
```
### ファイルの日付を取得
```nim
import os,times
block:
  # 日付を利用するには、timesモジュールのimportが必要
  var ctime,mtime,ltime : Time
  ctime = getCreationTime("members.txt")
  mtime = getLastModificationTime("members.txt")
  ltime = getLastAccessTime("members.txt")
  echo ctime
  echo mtime
  echo ltime
```
```
(stdout)
Wed May 25 22:04:53 2016
Wed May 25 22:04:53 2016
Wed May 25 22:04:53 2016
```
### ファイルの存在確認
```nim
import os,times
block:
  echo os.existsFile("members.txt")
```
```
(stdout)
true
```
### パスの結合
```nim
import os,times
block:
  echo joinPath("/","tmp","log") == "/tmp" / "log"
```
```
(stdout)
true
```
### パスの分割
```nim
import os,times
block:
  var parent = splitPath("usr/local/bin")
  echo parent.head
  echo parent.tail
block:
  var parent = "usr/local/bin".splitPath
  echo parent.head
  echo parent.tail
```
```
(stdout)
usr/local
bin
usr/local
bin
```
### 親ディレクトリを取得し、パスを連結
```nim
import os,times
block:
  var path = "/usr/local/bin" /../ "lib"
  echo path
```
```
(stdout)
/usr/local/lib
```
### ファイル名の分解
```nim
import os,times
block:
  var (dir, name, ext) = splitFile("usr/local/nimc.html")
  echo dir
  echo name
  echo ext
```
```
(stdout)
usr/local
nimc
.html
```
### パターンにマッチするファイルを取得する
```nim
import os,times
block:
  var i = 0
  for f in walkFiles("/usr/bin/z*"):
    i += 1 ; if i > 10: break # 数が多いので１０個まで
    echo f
```
```
(stdout)
/usr/bin/zcat
/usr/bin/zcmp
/usr/bin/zdiff
/usr/bin/zegrep
/usr/bin/zeisstopnm
/usr/bin/zenheiset
/usr/bin/zenity
/usr/bin/zfgrep
/usr/bin/zforce
/usr/bin/zgrep
```
### ディレクトリ内のファイルを取得する
```nim
import os,times
block:
  var i = 0
  for f in walkDir("/var/log"):
    i += 1 ; if i > 10: break # 数が多いので１０個まで
    # タプルが返される
    echo f.path
```
```
(stdout)
/var/log/tallylog
/var/log/lastlog
/var/log/openlmi-install.log
/var/log/wtmp
/var/log/sssd
/var/log/samba
/var/log/httpd
/var/log/ppp
/var/log/pluto
/var/log/libvirt
```
### 再帰的にディレクトリを探索する
```nim
import os,times
block:
  var i = 0
  for f in walkDirRec("/var/log/"):
    i += 1 ; if i > 10: break # 数が多いので１０個まで
    echo "recursive:" & f
```
```
(stdout)
recursive:/var/log/tallylog
recursive:/var/log/lastlog
recursive:/var/log/openlmi-install.log
recursive:/var/log/wtmp
recursive:/var/log/yum.log
recursive:/var/log/dmesg.old
recursive:/var/log/Xorg.0.log.old
recursive:/var/log/wpa_supplicant.log-20160309
recursive:/var/log/spooler-20160503
recursive:/var/log/secure-20160521
```
### 再帰的にディレクトリを探索する＋ディレクトリのみ表示
```nim
import os,times
block:
  # と思ったら、pcDirではyieldしないみたい
  var i = 0
  for f in walkDirRec("/var/log/",{pcDir}):
    i += 1 ; if i > 10: break # 数が多いので１０個まで
    echo "dir only:" & f
```
```
(stdout)
```
### 再帰的にディレクトリを探索する＋ファイルのみ表示
```nim
import os,times
block:
  var i = 0
  for f in walkDirRec("/var/log/",{pcFile}):
    i += 1 ; if i > 10: break # 数が多いので１０個まで
    echo "file only:" & f
```
```
(stdout)
file only:/var/log/tallylog
file only:/var/log/lastlog
file only:/var/log/openlmi-install.log
file only:/var/log/wtmp
file only:/var/log/yum.log
file only:/var/log/dmesg.old
file only:/var/log/Xorg.0.log.old
file only:/var/log/wpa_supplicant.log-20160309
file only:/var/log/spooler-20160503
file only:/var/log/secure-20160521
```
### テンポラリディレクトリを取得
```nim
import os,times
block:
  echo getTempDir()
```
```
(stdout)
/tmp/
```
### アプリケーション関連フォルダ
```nim
import os,times
block:
  # アプリケーションファイル名
  echo getApplicationFileName()
  echo getAppFileName()
  # アプリケーション実行フォルダ
  echo getApplicationDir()
  echo getAppDir()
```
```
(stdout)
/tmp/test
/tmp/test
/tmp
/tmp
```
### ２つのファイルのうちどちらが新しいか判定
```nim
import os,times
block:
  open("a.txt",FileMode.fmWrite).close
  sleep(1000)
  open("b.txt",FileMode.fmWrite).close
  # a is newer than b => false
  echo fileNewer("a.txt","b.txt")
  # b is newer than a => true
  echo fileNewer("b.txt","a.txt")
```
```
(stdout)
false
true
```
### ２つのファイルが同じかどうかをチェックする
```nim
import os,times
block:
  echo sameFileContent("members.txt","members.txt")
  echo sameFileContent("members.txt","a.txt")
```
```
(stdout)
true
false
```