2

特定のフォルダーを再帰的に読み取る ac# コンソール アプリケーションを作成しようとしています。これらのフォルダには、何千もの .jpg 画像があります

フォルダ構造はいくつかのレベルで非常に深く、例は次のようになります。

Scc-LocalPhoto/testfiles/1997/JAN-JUN 1997/APRIL 1997/7.4.97 - 11.4.97/FRI11.4.97/

ご覧のとおり、フォルダー構造は非常に乱雑ですが、これを制御することはできません。

私の仕事は、すべてのフォルダーを読むことです。画像からメタ データを取り出し、XML ファイルに保存します。次に、すべてのフォルダーを同じレイアウトでコピーして、新しいフォルダーに貼り付ける必要があります。

すべてのディレクトリを読み込んで、画像からメタデータを抽出し、xml ファイルに保存できると思います。

どうすればよいかわからないのは、すべてのフォルダーと画像をコピーして貼り付け、同じフォルダー構造を維持する新しいディレクトリに貼り付けることです。

このタスクを実行する効率的な方法を知っている人はいますか、それとも、出発点として使用できるプロジェクト、利用可能なコードはありますか?

私はC#とコンソールアプリの作成にかなり慣れていません。御時間ありがとうございます。

4

2 に答える 2

2

ディレクトリを再帰的に解析する

static void ParseDirectories(string root)
{
    ProcessDirectory(new DirectoryInfo(root));

    string[] subDirectories = Directory.GetDirectories(root);

    // No more directories to explore
    if (subDirectories.Length == 0)
        return;

    foreach (string subDirectory in subDirectories)
    {
        ParseDirectories(subDirectory);
    }
}

ディレクトリ内のファイルの処理

static void ProcessDirectory(DirectoryInfo directory)
{
    foreach (FileInfo file in directory.EnumerateFiles("*.jpg")
    {
        // record metadata and do other work on each file here
    }
}

ディレクトリ ツリーのコピー

static void CopyDirectoryTree(DirectoryInfo source, DirectoryInfo dest)
{
    if (!Directory.Exists(dest.FullName))
        Directory.CreateDirectory(dest.FullName);

    bool overwrite = true;

    // Copy files
    foreach (FileInfo file in source.EnumerateFiles())
    {
        file.CopyTo(Path.Combine(dest.ToString(), file.Name), overwrite);
    }

    // Copy Sub-directories
    foreach (DirectoryInfo subDirectory in source.GetDirectories())
    {
        DirectoryInfo newDirectory = destination.CreateSubdirectory(subDirectory.Name);
        CopyDirectoryTree(subDirectory, newDirectory);
    }
}

使用例

static void Main(string[] args)
{
    // Process each directory
    string initialDirectory = @"C:\path_to_folder";
    ParseDirectories(initialDirectory);

    // Copy directory tree
    string destinationDirectory = @"C:\path_to_new_root_directory";
    CopyDirectoryTree(
        new DirectoryInfo(initialDirectory),
        new DirectoryInfo(destinationDirectory));
}

お役に立てれば!

于 2011-06-10T09:48:23.853 に答える
0

私の意見では、もう少し簡単な次のことをお勧めします。

public static void CopyFolderTree(string sourcePath, string targetPath)
{
    var sourceDir = new DirectoryInfo(sourcePath);
    var targetDir = new DirectoryInfo(targetPath);

    targetDir.Create();

    foreach(var file in sourceDir.GetFiles())
        file.CopyTo(Path.Combine(targetPath, file.Name), true);

    foreach(var subfolder in sourceDir.GetDirectories())
        CopyFolderTree(subfolder.FullName, Path.Combine(targetPath, subfolder.Name));
}
于 2013-10-15T05:37:08.590 に答える