2014年12月03日

C#で指定されたフォルダ以下のファイルをゴミ箱へ

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その53

■問題 (出題者:にしお さん)
指定したフォルダ以下にある、ファイル名が"~"で終わるファイルを削除するプログラムを作ってください。 指定したフォルダの中にあるフォルダのさらに中にあるファイルも削除の対象です。

今回は、シリーズ53回目にちなんで、ごみ箱に関する問題を取り上げます(^^;;
問題文から判断すると、普通にファイルの削除をすればOKそうな問題ですが、せっかくなので ゴミ箱へ移動するコードとしてみました。

以下のようなクラスを書きました。
Microsoft.VisualBasicアセンブリを参照に加えています。
このアセンブリのなかの、FileSystem.DeleteFile メソッドを使えば、簡単にゴミ箱への移動ができます。
作成したCleanメソッドの第3引数は省略可能です。
RecycleOption.DeletePermanentlyを指定すれば、ゴミ箱への移動ではなく、削除することができます。
ちなみに、再帰処理を書くのが面倒なので、Directory.GetFiles をつかって、指定フォルダ以下のすべてのファイルを求めています。

using System;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Linq;

namespace Doukaku.Org {

    public static class FileCleaner {
        public static void Clean(string dir, Func<string,bool> filter,
                                 RecycleOption option = RecycleOption.SendToRecycleBin) {
            var files = Directory.GetFiles(dir, "*", System.IO.SearchOption.AllDirectories);
            foreach (var filepath in files) {
                if (filter(filepath) == true)
                    FileSystem.DeleteFile(filepath, UIOption.OnlyErrorDialogs, option);
            }
        }
    }
}

使うときには、こんな風に書きます。

FileCleaner.Clean("C:\\TEMP", s => s.Last() == '~');

  

Posted by gushwell at 22:30Comments(0)TrackBack(0)

2014年05月06日

ファイル更新の監視

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その4

■問題 (出題者:にしお さん) 

あるファイル名がfilenameという変数に入っているとします。 このファイルが更新されるたびに"modified!"と表示するプログラムを作ってください。 もしOSに依存する場合はそのOS名のタグを、 依存しない場合は「OS非依存」というタグをつけてください。 わからなければつけなくても構いません。


filenameにワイルドカードを指定できるようにしてみました。 また、modified! のほかに、created! renamed! deleted! も表示できるようにしています。

■C#で書いたコード
using System;
using System.IO;

namespace Sample {
    class Program {
        static void Main(string[] args) {
            string filename = @"d:\temp\*.txt";
            StartFileWatcher(filename);

            // 以下テストコード
            // 最後のReadKeyを実行する前ならば、
            // エクスプローラでファイル作成等をしても確認できる。
            Console.ReadKey();
            var stream = File.Create(@"d:\temp\FileSystemWatcher1.txt");
            stream.Close();
            Console.ReadKey();

            File.WriteAllText(@"d:\temp\FileSystemWatcher2.txt", "aaa");
            Console.ReadKey();

            File.Move(@"d:\temp\FileSystemWatcher1.txt", @"d:\temp\FileSystemWatcher3.txt");
            Console.ReadKey();

            File.Delete(@"d:\temp\FileSystemWatcher2.txt");
            File.Delete(@"d:\temp\FileSystemWatcher3.txt");
            Console.ReadKey();
        }

        static void StartFileWatcher(string filename) {
            string path = Path.GetDirectoryName(filename);
            string name = Path.GetFileName(filename);

            FileSystemWatcher fsw = new FileSystemWatcher(path, name);
            fsw.Changed += fsw_Changed;

            // ラムダ式を使って書いた場合
            fsw.Renamed += (sender, eventArgs) => Console.WriteLine("renamed!");
            fsw.Created += (sender, eventArgs) => Console.WriteLine("created!");
            fsw.Deleted += (sender, eventArgs) => Console.WriteLine("deleted!");
            fsw.EnableRaisingEvents = true;           
        }       

        static void fsw_Changed(object sender, FileSystemEventArgs e) {
            Console.WriteLine("modified!");
        }
    }
}
  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2014年04月20日

C#でファイルサイズの取得

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その2

■問題 (出題:ところてん さん)
ファイルが存在しているか調べ、存在していたらファイルサイズを取得し、表示してください。


2つの方法で書いてみました。

■C#のコード 
using System;
using System.IO;

namespace Sample {
    class Program {
        static void Main(string[] args) {
            PrintFileSize(@"c:\Windows\notepad.exe");
            PrintFileSize2(@"c:\Windows\notepad.exe");
            Console.ReadLine();
        }

        static void PrintFileSize(string filePath) {
            if (File.Exists(filePath)) {
                var fi = new FileInfo(filePath);
                Console.WriteLine("{0} byte(s)",fi.Length);
            }
        }

        static void PrintFileSize2(string filePath) {
            var fi = new FileInfo(filePath);
            if (fi.Exists) {
                Console.WriteLine("{0} byte(s)", fi.Length);
            }
        }
    }
}


  
Posted by gushwell at 22:00Comments(0)TrackBack(0)