Обработка нескольких подкаталогов и всех файлов в каждом каталоге - PullRequest
0 голосов
/ 11 июня 2019

Надеюсь, здесь кто-то может мне помочь, я не очень знаком с работой с каталогами. Мое приложение сжимает файлы и сохраняет их в каталоге мультимедиа, а также сохраняет их в базе данных. Это хорошо работает, если я создаю каталог и фактически вызываю каждый файл отдельно.

Но я хотел бы сделать его динамическим и обрабатывать все папки в папке установки. Для каждого каталога в этом каталоге я хотел бы обрабатывать каждый каталог и все файлы в этом каталоге.

Что я пробовал:

public class SetupFiles : ISetupFiles
{
    private readonly ISession _session;
    private readonly IFileService _fileService;
    private readonly IFileProvider _fileProvider;

    public SetupFiles(ISession session, IFileService fileService, IFileProvider fileProvider)
    {
        _session = session;
        _fileService = fileService;
        _fileProvider = fileProvider;
    }
public void Setup()
    {
        string installPath = ("install/images/");
        _session.Transact(session =>
        {

            DirectoryInfo dir = new DirectoryInfo(installPath);
            DirectoryInfo[] subdirectories = dir.GetDirectories();
            foreach (var subdirectory in subdirectories)
            {
                string currentDirName = Directory.GetCurrentDirectory();
                var directory = new MediaCategory
                {
                    Name = subdirectory.Name.ToString().ToUpper(),
                    UrlSegment = subdirectory.Name.Trim().ToLower(),
                };
                session.Save(directory);

                string[] pngFiles = Directory.GetFiles(currentDirName, "*.png", SearchOption.AllDirectories);
                string[] jpgFiles = Directory.GetFiles(currentDirName, "*.jpg", SearchOption.AllDirectories);
                string[] gifFiles = Directory.GetFiles(currentDirName, "*.gif", SearchOption.AllDirectories);
                string[] pdfFiles = Directory.GetFiles(currentDirName, "*.pdf", SearchOption.AllDirectories);

                foreach (var currentPngFile in pngFiles)
                {
                    var fileStream = _fileProvider.GetFileInfo(currentPngFile).CreateReadStream();
                    MediaFile dbpngFile = _fileService.AddFile(fileStream, Path.GetFileName(currentPngFile), "image/png", fileStream.Length, directory);
                }
                foreach (var currentJpgFile in jpgFiles)
                {
                    var fileStream = _fileProvider.GetFileInfo(currentJpgFile).CreateReadStream();
                    MediaFile dbjpgFile = _fileService.AddFile(fileStream, Path.GetFileName(currentJpgFile), "image/jpg", fileStream.Length, directory);
                }
                foreach (var currentGifFile in gifFiles)
                {
                    var fileStream = _fileProvider.GetFileInfo(currentGifFile).CreateReadStream();
                    MediaFile dbgifFile = _fileService.AddFile(fileStream, Path.GetFileName(currentGifFile), "image/gif", fileStream.Length, directory);
                }
                foreach (var currentPdfFile in pdfFiles)
                {
                    var fileStream = _fileProvider.GetFileInfo(currentPdfFile).CreateReadStream();
                    MediaFile dbgifFile = _fileService.AddFile(fileStream, Path.GetFileName(currentPdfFile), "file/pdf", fileStream.Length, directory);

                }
            }

        });
    }

Но по какой-то причине я получаю ошибку, что не могу найти каталог.

Любая помощь будет принята с благодарностью.

в строке DirectoryInfo[] subdirectories = dir.GetDirectories(); dir показывает каталог, но GetDirectories() возвращает NULL.

1 Ответ

0 голосов
/ 12 июня 2019

Должно быть, у меня был мозговой пердеть.С помощью @ ciubotariu-florin мне удалось обойти эту проблему.Для всех, у кого есть эта проблема, wwwroot является папкой среды и является частью веб-корня из конфигурации IIS.Таким образом, чтобы работать с Directory() и или DirectoryInfo(), вы должны использовать IHostingEnvironment, это позволяет вам использовать IHostingEnvironment.WebRootPath, поэтому изменив мой путь с

string installPath = ("install/images/");

на

string installPath = Path.Combine(_env.WebRootPath, "install/images/").ToLower();

решил мои проблемы.

...