Я пытаюсь поместить каждую папку, подпапки и файлы в объект вне пути.
На этом пути будет много папок верхнего уровня с множеством подпапок и файлов.
Мне нужно обработать каждую верхнюю папку, ее подпапки и файлы отдельно.
example
C: \ temp \ Folder1 \ SubFolder \ SubFiles
C: \ temp \ Folder2 \ SubFiles \ SubFolders \ SubFiles
Необходимо обработать папку Folder1 с ее подкаталогами и заключить ее в объект. и то же самое для папки 2.
вот код, в котором отказано в доступе, потому что поток остается открытым, и если я оборачиваю поток в using, он закрывается до того, как я смогу обработать информацию.
private static IEnumerable<LocalFile> GetLocalFile(string source)
{
return Directory.GetDirectories(source)
.SelectMany(m =>
{
return Directory.EnumerateFileSystemEntries(m, "*", SearchOption.AllDirectories)
.Select(x =>
{
var relative = x.Substring(source.Length + 1);
var localFile = new LocalFile(relative,
() =>
{
return File.OpenRead(x);
});
return localFile;
});
});
}
public sealed class LocalFile
{
private readonly Func<Task<Stream>> openLocal;
public LocalFile(string relativePath, Func<Stream> openLocal)
{
if (openLocal == null)
{
throw new ArgumentNullException(nameof(openLocal));
}
this.RelativePath = relativePath ?? throw new ArgumentNullException(nameof(relativePath));
this.openLocal = () => Task.FromResult(openLocal());
}
public LocalFile(string relativePath, Func<Task<Stream>> openLocal)
{
this.RelativePath = relativePath ?? throw new ArgumentNullException(nameof(relativePath));
this.openLocal = openLocal ?? throw new ArgumentNullException(nameof(openLocal));
}
public string RelativePath { get; }
public Task<Stream> OpenLocal() => this.openLocal();
}
Спасибо
Что такое LocalFile
?
локальный файл - это просто объект, содержащий два свойства: относительный путь к файлу и поток файла.
Проблема в том, что мне нужно обрабатывать каждую верхнюю папку индивидуально. Функция GetLocal () генерирует исключение отказа в доступе, и это связано с тем, что файловый поток все еще открыт, если я оборачиваю file.openread () в, используя его, другое исключение не может получить доступ к закрытому потоку, как упоминалось выше.
Наконец то получил ...
Сделал новый класс
public class LocalFolder
{
public string FolderPath { get; }
public IEnumerable<LocalFile> FolderFiles { get; }
public LocalFolder(string folderPath, IEnumerable<LocalFile> files)
{
this.FolderPath = folderPath ?? throw new ArgumentNullException(nameof(folderPath));
this.FolderFiles = files ?? throw new ArgumentNullException(nameof(files));
}
}
вот код
private static IEnumerable<LocalFolder> GetFolderFiles(string source)
{
var directories = Directory.EnumerateFileSystemEntries(source);
var folderFiles = directories
.Where(d => !d.Contains("."))
.Select(m =>
{
var files = Directory.EnumerateFiles(m, "*", SearchOption.AllDirectories)
.Select(f =>
{
var relative = f.Substring(source.Length + 1);
return new LocalFile(relative, () => File.OpenRead(f));
});
return new LocalFolder(m,
files);
});
var filesinDir = directories
.Where(d => d.Contains("."))
.Select(m =>
{
var files = Directory.EnumerateFiles(source, "*", SearchOption.TopDirectoryOnly)
.Select(f =>
{
var relative = f.Substring(source.Length + 1);
return new LocalFile(relative, () => File.OpenRead(f));
});
return new LocalFolder(m,
files);
});
return folderFiles.Concat(filesinDir);
}
Надеюсь, это поможет кому-то, кто сталкивается с подобной ситуацией.
Спасибо
Не могли бы вы предоставить еще какой-нибудь код, чтобы проиллюстрировать проблему? Я действительно не понимаю, что вы делаете и где сталкиваетесь с проблемами. Кроме того, вы можете выбрать более информативный заголовок вопроса.