使用archive.dart访问目录中的文件

0yycz8jy  于 2023-04-03  发布在  Hive
关注(0)|答案(1)|浏览(206)

我目前正在尝试从zip压缩文件中提取一些信息,但没有将其完全解压缩到磁盘。zip压缩文件采用标准格式:

myfile.zip
   - myfile.json
   - myfile.geojson
   - images/
      - image1.jpeg
      - image2.jpeg

我使用archive_io.dart来访问存档中的信息,但我对如何从images/子目录中获取图像感到困惑。到目前为止,我已经实现了一个打开zip存档的函数:

Archive _openArchive(String filePath) {
    final inputStream = InputFileStream(filePath);
    final archive = ZipDecoder().decodeBuffer(inputStream);
    return archive;
    /* for (ArchiveFile file in archive.files) {
      if (file.isFile) {
        if (file.name.contains('json') && !file.name.contains('geojson')) {
          return file;
        }
      }
    } */
  }

然后在另一个函数中使用它,从myfile.jsonmyfile.geojson中读取数据。

void _extractArchiveData() async {
    await _pickFiles(); //from file_picker.dart
    FinalizedHike? outHike; //a class that I use for this project
    var absPath = _file?.first.path.toString(); //the path of the zip archive from the file picker
    //print(absPath);
    if (absPath != null) {
      widget.filePath = absPath;
      Archive openArchive = _openArchive(absPath); //open the zip file
      try {
        for (ArchiveFile file in openArchive.files) {
          //reads in the data from myfile.json and myfile.geosjon
          if (file.isFile) {
            if (file.name.contains('json') && !file.name.contains('geojson')) {
              var hikeData = jsonDecode(utf8.decode(file.content));
              uploadHike = FinalizedHike.fromJson(hikeData);
            } else if (file.name.contains('geojson')) {
              geoJson = jsonDecode(utf8.decode(file.content));
            } else if (!file.isFile) {
              // Code to go into the images/ subdir and pull out a specific image based off 
              // of a file name that I would pass in.
            }
          }
        }
      } catch (e) {
        print('error ${e}');
      }
    }
  }

我不确定这是否可行。为了创建zip压缩包,我还使用archive_io.dart,使用以下fxn:

void _createArchive() {
    try {
      var encoder = ZipFileEncoder();
      encoder.zipDirectory(Directory(_saveAsFileName!),
          filename: '$_saveAsFileName.zip');
    } catch (e) {
      print(e.toString());
    }
  }

我相信这是递归压缩,所以images/子目录也被压缩了。我曾考虑过尝试将images/作为InputStream传递给ZipDecoder.decodeBuffer(),但我不确定如何做到这一点。有没有办法将ArchiveFile转换为InputStream

cetgtptt

cetgtptt1#

我做了一些深入的研究,发现你可以直接访问这些文件,它们的名字只会被标记为images/image1.jpeg。要仔细检查,你可以用途:

for (final file in archive) {
   print(file.name);
}

退货

myfile.json
myfile.geojson
images/image1.jpeg
images/image2.jpeg

相关问题