File.OpenRead()目录,子目录,文件,然后将文件夹和文件写入另一个目录

时间:2018-01-20 02:22:19

标签: c# filestream

我希望从目录结构中读取文件夹和文件,如此... e.g

C:\RootFolder
            SubFolder1
               SubFolder2
                   File1
                   File2
                         SubFolder3
                                 File3
 Files....
 Files....

我想读取文件和文件夹,并写入另一个我无法使用副本的目录,因为我想写的目录是远程的而不是本地的。

我在这里阅读文件....我喜欢能够阅读文件夹和文件并将其写入另一个目录。

 public static IEnumerable<FileInfo> GetFiles(string dir)
        {
            return Directory.EnumerateFiles(dir, "*", SearchOption.AllDirectories)
                .Select(path =>
                {                    
                    var stream = File.OpenRead(path);
                    return new FileInfo(Path.GetFileName(path), stream);
                })
                .DisposeEach(c => c.Content);
        }

此函数将文件写入远程sftp站点。

 public Task Write(IEnumerable<FileInfo> files)
        {
            return Task.Run(() =>
            {
                using (var sftp = new SftpClient(this.sshInfo))
                {
                    sftp.Connect();
                    sftp.ChangeDirectory(this.remoteDirectory);

                    foreach (var file in files)
                    {
                      sftp.UploadFile(file.Content, file.RelativePath);
                    }
                }
            });
        }

在这个函数中,我从上面的函数中编写了读取文件。

    private async static Task SendBatch(Config config, Batch batch, IRemoteFileWriter writer)
    {
        var sendingDir = GetClientSendingDirectory(config, batch.ClientName);
        Directory.CreateDirectory(Path.GetDirectoryName(sendingDir));
        Directory.Move(batch.LocalDirectory, sendingDir);
        Directory.CreateDirectory(batch.LocalDirectory);
        //Use RemoteFileWriter...
        var files = GetFiles(sendingDir);

        await writer.Write(files).ContinueWith(t =>
        {
            if(t.IsCompleted)
            {
                var zipArchivePath = GetArchiveDirectory(config, batch);
                ZipFile.CreateFromDirectory(
                    sendingDir,
                    zipArchivePath + " " +
                    DateTime.Now.ToString("yyyy-MM-dd hh mm ss.Zip")
                    );
            }
        });



    }

谢谢!

2 个答案:

答案 0 :(得分:1)

您收到UnauthorizedAccessException: Access to the path 'C:\temp' is denied.因为您无法从文件夹中打开流,因为它不包含字节。

根据我的理解,您希望将文件从一个文件夹复制到另一个文件夹。

这个答案似乎涵盖了你在做什么。 https://stackoverflow.com/a/3822913/3634581

复制目录后,您可以创建zip文件。

如果您不需要复制文件并只创建Zip,我建议您这样做,因为它会减少磁盘IO并加快进程。

ZipArchive(https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive(v=vs.110).aspx)可用于直接创建zip文件。

答案 1 :(得分:0)

我认为这是解决方案

 public Task Write(IEnumerable<FileInfo> files)
    {
        return Task.Run(() =>
        {
            using (var sftp = new SftpClient(this.sshInfo))
            {
                sftp.Connect();
                sftp.ChangeDirectory(this.remoteDirectory);

                foreach (var file in files)
                {
                    var parts = Path.GetDirectoryName(file.RelativePath)
                        .Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);

                    sftp.ChangeDirectory(this.remoteDirectory);

                    foreach (var p in parts)
                    {
                        try
                        {
                            sftp.ChangeDirectory(p);
                        }
                        catch (SftpPathNotFoundException)
                        {
                            sftp.CreateDirectory(p);
                            sftp.ChangeDirectory(p);
                        }
                    }

                    sftp.UploadFile(file.Content, Path.GetFileName(file.RelativePath));
                }
            }
        });
    }

****解决方案的关键点是 此

var parts = Path.GetDirectoryName(file.RelativePath)
                            .Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);

我们调用* Path.GetDirectoryName 在文件本身上获取与文件相关的目录。 我们拆分文件目录以获取文件夹名称,最后创建我们从拆分中获取的文件夹名称并将文件上传到它。

我希望这有助于其他可能遇到此类问题的人。