我希望从目录结构中读取文件夹和文件,如此... 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")
);
}
});
}
谢谢!
答案 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 在文件本身上获取与文件相关的目录。 我们拆分文件目录以获取文件夹名称,最后创建我们从拆分中获取的文件夹名称并将文件上传到它。
我希望这有助于其他可能遇到此类问题的人。