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
在文件本身上获取与文件相关的目录。
我们拆分文件目录得到文件夹名,最后创建我们拆分得到的文件夹名,上传文件到里面。
我希望这对可能遇到此类问题的其他人有所帮助。
我希望从这样的目录结构中读取文件夹和文件.. 例如
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 在文件本身上获取与文件相关的目录。 我们拆分文件目录得到文件夹名,最后创建我们拆分得到的文件夹名,上传文件到里面。
我希望这对可能遇到此类问题的其他人有所帮助。