2
votes

I want to copy all files which are inside sub-folders.

folder structure -

Source\Folder1\Data\file1.txt

Source\Folder1\Data\file2.txt

Source\Folder1\Data\Temp1\temp1.txt

Source\Folder1\Data\Temp1\temp2.txt

I have following code but I'm only getting root and its sub-folders not inside it.

I want recursive code. Thanks to @Compufreak for recursive code I'm still unable to copy files because source is source folder not current.

public static void list_file()
{
    //***** Get list of all files/directories on the file share*****//
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["storageConnectionString"]);
    CloudFileClient fileClient = cloudStorageAccount.CreateCloudFileClient();
    CloudFileShare fileShare = fileClient.GetShareReference(ConfigurationManager.AppSettings["shareName"]);

    IEnumerable<IListFileItem> fileList = fileShare.GetRootDirectoryReference().ListFilesAndDirectories(ConfigurationManager.AppSettings["sourceName"]);

    CloudFileDirectory rootDir = fileShare.GetRootDirectoryReference();
    CloudFileDirectory sourceDir = rootDir.GetDirectoryReference(ConfigurationManager.AppSettings["sourceName"]);
    CloudFileDirectory destinationDir = rootDir.GetDirectoryReference(ConfigurationManager.AppSettings["destinationName"]);

    // Print all files/directories listed above.
    foreach (IListFileItem listItem in fileList)
    {
        // listItem type will be CloudFile or CloudFileDirectory.
        Console.WriteLine(listItem.Uri.Segments.Last());
        Console.WriteLine(listItem.GetType());
        if (listItem.GetType() == typeof(Microsoft.WindowsAzure.Storage.File.CloudFileDirectory))
        {
            list_subdir(listItem, sourceDir, destinationDir);
        }
    }
}

public static void list_subdir(IListFileItem list, CloudFileDirectory sourceDir, CloudFileDirectory destinationDir)
{
    Console.WriteLine("subdir");
    CloudFileDirectory fileDirectory = (CloudFileDirectory)list;
    IEnumerable<IListFileItem> fileList = fileDirectory.ListFilesAndDirectories();

    // Print all files/directories in the folder.
    foreach (IListFileItem listItem in fileList)
    {
        // listItem type will be CloudFile or CloudFileDirectory.
        if (listItem.GetType() == typeof(Microsoft.WindowsAzure.Storage.File.CloudFileDirectory))
        {
            list_subdir(listItem,sourceDir,destinationDir);
        }
        else
        {
            Console.WriteLine(listItem.Uri.Segments.Last());
            // move file to destination
            // Get a reference to the file we created previously.
            CloudFile sourceFile = sourceDir.GetFileReference(listItem.Uri.Segments.Last());

            // Ensure that the source file exists.
            if (sourceFile.Exists())
            {
                // Get a reference to the destination file.
                CloudFile destFile = destinationDir.GetFileReference(listItem.Uri.Segments.Last());

                // Start the copy operation.
                destFile.StartCopy(sourceFile);

                // Write the contents of the destination file to the console window.
                Console.WriteLine(destFile.DownloadText());
            }
        }
    }
}
1

1 Answers

2
votes

I'd recommend using recursion here (I added the call to list_subdir inside list_subdir if it's a directory):

public static void list_subdir(IListFileItem list)
    {
        Console.WriteLine("subdir");
        CloudFileDirectory fileDirectory = (CloudFileDirectory)list;
        IEnumerable<IListFileItem> fileList = fileDirectory.ListFilesAndDirectories();

        // Print all files/directories in the folder.
        foreach (IListFileItem listItem in fileList)
        {
            // listItem type will be CloudFile or CloudFileDirectory.
            if (listItem.GetType() == typeof(Microsoft.WindowsAzure.Storage.File.CloudFileDirectory))
            {
                list_subdir(listItem);
            } else {
                Console.WriteLine(listItem.Uri.Segments.Last());
            }
        }
 }