スポンサーサイト

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

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

今回はフォルダ処理をまとめておきたいと思います。
 
サンプルとして下のような構成のフォルダがあるとします。(Sドライブにあるとします。) 
 
347-1.jpg 
 
 
なおそれぞれのフォルダ内にはフォルダ名と同名で拡張子がtxtのテキストファイルが保存されているとします。
たとえばSF1SF1フォルダの中身は次のようになっており 
 
347-2.jpg 
 
SF1SF1SF1フォルダの中身は次のようになっています。 
 
347-3.jpg 

 
それではまずフォルダの存在の確認から、これは次のようにします。
 
> System.IO.Directory.Exists(@"s:\BlogTest\SF1");;
 
val it : bool = true
 
("s:\BlogTest\SF1" 等をフォルダのパス文字列といいます。)
 
つぎにフォルダの作成です。
 
> System.IO.Directory.CreateDirectory(@"s:\BlogTest\SF3");;
 
val it : System.IO.DirectoryInfo =
  SF3 {Attributes = Directory;
       CreationTime = 2010/07/05 19:39:02;
       CreationTimeUtc = 2010/07/05 10:39:02;
       Exists = true;
       Extension = "";
       FullName = "s:\BlogTest\SF3";
       LastAccessTime = 2010/07/05 19:39:02;
       LastAccessTimeUtc = 2010/07/05 10:39:02;
       LastWriteTime = 2010/07/05 19:39:02;
       LastWriteTimeUtc = 2010/07/05 10:39:02;
       Name = "SF3";
       Parent = BlogTest;
 
ご覧の通り新しいDirectoryが作成された上で、DirectoryInfo型の値が返り値として帰ってきます。
 
既存のフォルダのDirectoryInfoを得るには次のようにします。
 
> let di = new System.IO.DirectoryInfo(@"s:\BlogTest\SF3")  ;;
val di : System.IO.DirectoryInfo = s:\BlogTest\SF3
 
> di;;
val it : System.IO.DirectoryInfo =
  s:\BlogTest\SF3 {Attributes = Directory;
                   CreationTime = 2010/07/05 19:39:02;
                   CreationTimeUtc = 2010/07/05 10:39:02;
                   Exists = true;
                   Extension = "";
                   FullName = "s:\BlogTest\SF3";
                   LastAccessTime = 2010/07/05 19:39:02;
                   LastAccessTimeUtc = 2010/07/05 10:39:02;
                   LastWriteTime = 2010/07/05 19:39:02;
                   LastWriteTimeUtc = 2010/07/05 10:39:02;
                   Name = "SF3";
                   Parent = BlogTest;
                   Root = s:\;}
 
次はフォルダの移動です。(移動といっても同時に名前の変更もできます。)
 
これは
System.IO.Directory.Move(移動されるフォルダのパス文字列,移動先フォルダのパス文字列)
で行います。
「移動先フォルダ」が作成され、移動元フォルダの中身が移動され、移動元フォルダが消去される。という作用をします。 
 
347-4.jpg 

 
> System.IO.Directory.Move(@"s:\BlogTest\SF3",@"s:\BlogTest\SF1\SF1SF1\new_SF3");;
val it : unit = () 
 
347-5.jpg 
 
フォルダの削除は次のようにします
ただし、フォルダの中身が空でないとエラーが発生します。
 
> System.IO.Directory.Delete(@"s:\BlogTest\SF1\SF1SF1\new_SF3");;
val it : unit = ()
 
アプリケーションの現在のカレントディレクトリをを取得するにはDirectoryクラスのGetCurrentDirectoryメソッドを使用します。またカレントディレクトリをを設定するにはSetCurrentDirectoryメソッドを使用します。 カレントディレクトリとは、ファイルパスをドライブ文字から指定しなかった場合に開始位置となる場所のことです。)
 
> System.IO.Directory.GetCurrentDirectory();;
val it : string = "C:\Users\T_GYOUTEN\AppData\Local\Temp"
 
指定したフォルダ内のサブフォルダを取得するにはSystem.IO.Directory.GetDirectoriesを利用します。
 
> System.IO.Directory.GetDirectories (@"s:\BlogTest\SF1") ;;
val it : string [] = [|"s:\BlogTest\SF1\SF1SF1"; "s:\BlogTest\SF1\SF1SF2"|]
 
存在しないときは
 
> System.IO.Directory.GetDirectories (@"s:\BlogTest\SF1\SF1SF1\SF1SF1SF1") ;;
val it : string [] = [||]
 
となり要素数が0の配列が帰ってきます。
 
ご覧の通り、フォルダ内のサブフォルダ(のパス)が取得されており、それより下の階層にあるサブフォルダは取得されていません。
下の階層にあるサブフォルダは取得するには再帰を用いるのが一般的です。
 
> let rec dirsUnder (path : string) =
    [|
        let sDirs = System.IO.Directory.GetDirectories (path)
        yield! sDirs
        for subDir in sDirs do
            yield! dirsUnder subDir
     |];;
 
val dirsUnder : string -> string []
 
もしyield!の部分がyieldなら、配列の要素がはいるべき部分に配列が返ってくることにになります。[| ".." ; [| "  "|]; ...|]という形となり、配列の要素が同じ型でなくなるので、エラーでコンパイルできません。yield!は返ってきた配列を、[| |]をはずして、元の配列の一部にしてくれます。一段下の段階のものを、上に引き戻して処理してくれるので、再帰の結果をフラット化するのによく用いられます。
 
実行例
> dirsUnder  (@"s:\BlogTest") ;;
val it : string [] =
  [|"s:\BlogTest\SF1"; "s:\BlogTest\SF2"; "s:\BlogTest\SF1\SF1SF1";
    "s:\BlogTest\SF1\SF1SF2"; "s:\BlogTest\SF1\SF1SF1\SF1SF1SF1";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF2"; "s:\BlogTest\SF2\SF2SF1"|]
 
それではこれを用いてBlogTestフォルダで、作成時刻が2010/07/05 18:19:00以降のフォルダだけを抜き出してみます。
 
> dirsUnder  (@"s:\BlogTest")  
  |> Array.map (fun path -> new System.IO.DirectoryInfo (path))
  |> Array.filter(fun di -> System.DateTime.Compare(di.CreationTime,criTime) > 0)
  |> Array.map (fun di -> (di.FullName))     ;;
 
val it : string [] =
  [|"s:\BlogTest\SF1\SF1SF2"; "s:\BlogTest\SF1\SF1SF1\SF1SF1SF1";
    "s:\BlogTest\SF1\SF1SF1\SF1SF1SF2"; "s:\BlogTest\SF2\SF2SF1"|]
    
 
なおDirectoryInfo型の値はインスタンスメソッドGetDirectories()をもっていて、これを利用しても、このディレクトリに含まれるディレクトリの一覧を得ることができます。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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