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

File.OpenRead() Directories , Sub Directories , Files, and then Write Folders and files to another directory

我希望从这样的目录结构中读取文件夹和文件.. 例如

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")
                    );
            }
        });



    }

谢谢!

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

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

这个答案似乎涵盖了你正在做的事情。

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

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

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

我想出了解决办法

 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 在文件本身上获取与文件相关的目录。 我们拆分文件目录得到文件夹名,最后创建我们拆分得到的文件夹名,上传文件到里面。

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