スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その43 ファイル、フォルダ処理(2)

今回はファイル処理をまとめておきたいと思います。
 
サンプルとして下のような構成のフォルダが(Sドライブにあるとします。(前回と同じものです。) 
 
347-1.jpg 
 
 
なおそれぞれのフォルダ内にはフォルダ名と同名で拡張子がtxtのテキストファイルが保存されているとします。
たとえばSF1SF1フォルダの中身は次のようになっており 
 
347-2.jpg 
 
SF1SF1SF1フォルダの中身は次のようになっています。 
 
347-3.jpg 
 
それではまずファイルの存在の確認から、これは次のようにします。
 
> System.IO.File.Exists(@"s:\BlogTest\SF1\SF1.txt") ;;
val it : bool = true
 
ディレクトリ(フォルダ)については、DirectoryInfo型の値が存在し、詳細な情報を得ることができました。同様に、ファイルについてはFileInfo型の値が定義されています。
 
> let fi = new System.IO.FileInfo(@"s:\BlogTest\SF1\SF1.txt");;
val fi : System.IO.FileInfo = s:\BlogTest\SF1\SF1.txt
 
> fi;;
val it : System.IO.FileInfo =
  s:\BlogTest\SF1\SF1.txt {Attributes = Archive;
                           CreationTime = 2010/07/05 19:26:05;
                           CreationTimeUtc = 2010/07/05 10:26:05;
                           Directory = s:\BlogTest\SF1;
                           DirectoryName = "s:\BlogTest\SF1";
                           Exists = true;
                           Extension = ".txt";
                           FullName = "s:\BlogTest\SF1\SF1.txt";
                           IsReadOnly = false;
                           LastAccessTime = 2010/07/05 19:26:05;
                           LastAccessTimeUtc = 2010/07/05 10:26:05;
                           LastWriteTime = 2010/07/05 19:23:58;
                           LastWriteTimeUtc = 2010/07/05 10:23:58;
                           Length = 3L;
                           Name = "SF1.txt";}
 
Length がサイズで、3バイトという意味という意味になります。(Int64型です。)
 
ファイルの属性(「隠しファイルであるか」等)を調べるには以下のようにします。
 
> let fa = System.IO.File.GetAttributes(@"s:\BlogTest\SF1\SF1.txt");;
 
val fa : System.IO.FileAttributes = Archive
 
この値とSystem.IO.FileAttributes.Hiddenとの論理和をとり、それで変化しなければ、「その属性をもつ」ということになります。
 
(例)
○隠しファイルかどうかを調べる
> (fa &&& System.IO.FileAttributes.Hidden) =  System.IO.FileAttributes.Hidden;;
val it : bool = false
○読み取り専用かどうかを調べる
> (fa &&& System.IO.FileAttributes.ReadOnly) =  System.IO.FileAttributes.ReadOnly  ;;
val it : bool = false
 
その他の属性についてはhttp://msdn.microsoft.com/ja-jp/library/system.io.fileattributes.aspx
を参照してください。
 
また簡単なテキストファイルの読み書きについては 「テキストファイルの読み込み」を参照してください。
 
次はファイルのコピーです。これはSystem.IO.File.Copy(コピー元,コピー先)で、行えますが、コピー先ファイルが既に存在する場合は例外が発生します。コピー先のディレクトリ(フォルダ)が存在しない場合も例外が発生します。
System.IO.File.Copy(コピー元,コピー先,true)とすると上書きコピーができます。
 
移動はSystem.IO.File.Move(移動元,移動先)で実行できます。コピーして、もとのファイルを削除するのと同等です。
 
削除はSystem.IO.File.Delete(削除するファイル)でおこないます。存在しないファイルを削除しようとしても例外は発生しません。)
 
あるフォルダ以下のすべてのファイルの一覧を得るには、例えば次のようにします。
 
> let rec filesUnder (basePath : string) =
    [|
        yield! System.IO.Directory.GetFiles(basePath)
        let sDirs = System.IO.Directory.GetDirectories (basePath)
        for subDir in sDirs do
            yield! filesUnder subDir
     |];;
 
val filesUnder : string -> string []
 
(実行例)
 
> filesUnder @"s:\BlogTest";;
 
val it : string [] =
  [|"s:\BlogTest\SF1\SF1.txt"; "s:\BlogTest\SF1\SF1SF1\SF1SF1.txt";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF1\SF1SF1SF1.txt";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF2\SF1SF1SF2.txt";
    "s:\BlogTest\SF1\SF1SF2\SF1SF2.txt"; "s:\BlogTest\SF2\SF2.txt";
    "s:\BlogTest\SF2\SF2SF1\SF2SF1.txt"|]
    
 
 
> filesUnder @"s:\BlogTest\SF1\SF1SF1";;
 
val it : string [] =
  [|"s:\BlogTest\SF1\SF1SF1\SF1SF1.txt";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF1\SF1SF1SF1.txt";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF2\SF1SF1SF2.txt"|]
 
あと少しパス関連のメソッドをメモしておきます。
 
○ファイルパスを結合する
 
> System.IO.Path.Combine(@"s:\BlogTest\SF1", "SF1.txt");;
val it : string = "s:\BlogTest\SF1\SF1.txt"
 
> [@"s:\BlogTest";"SF1";"SF1.txt"]
  |> List.reduce (fun s x  -> System.IO.Path.Combine(s,x)) ;;
val it : string = "s:\BlogTest\SF1\SF1.txt"
 
○ファイルパスからファイル名を抜き出す
 
> System.IO.Path.GetFileName(@"s:\BlogTest\SF1\SF1.txt");;
val it : string = "SF1.txt"
 
○ファイルパスから拡張子を含まないファイル名を抜き出す
 
> System.IO.Path.GetFileNameWithoutExtension(@"s:\BlogTest\SF1\SF1.txt");;
val it : string = "SF1"
 
○ファイルパスからディレクトリ (フォルダ) を抜き出す
 
> System.IO.Path.GetDirectoryName(@"s:\BlogTest\SF1\SF1.txt");;
val it : string = "s:\BlogTest\SF1"
 
○ファイルパスから拡張子を抜き出す
 
> System.IO.Path.GetExtension(@"s:\BlogTest\SF1\SF1.txt");;
val it : string = ".txt"
 
> System.IO.Path.ChangeExtension(@"s:\BlogTest\SF1\SF1.txt","log");;
val it : string = "s:\BlogTest\SF1\SF1.log"
 
○拡張子を変更する
 
> System.IO.Path.ChangeExtension(@"s:\BlogTest\SF1\SF1.txt","log");;
val it : string = "s:\BlogTest\SF1\SF1.log"
 
○拡張子を取り去る
 
> System.IO.Path.ChangeExtension(@"s:\BlogTest\SF1\SF1.log",null);;
val it : string = "s:\BlogTest\SF1\SF1"
 
○存在する論理ドライブ名をすべて取得する
 
>  System.IO.Directory.GetLogicalDrives();;
val it : string [] =
  [|"C:\"; "E:\"; "F:\"; "G:\"; "H:\"; "I:\"; "J:\"; "S:\"|]
  
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。