【问题标题】:Get files from a directory in Flutter从 Flutter 中的目录获取文件
【发布时间】:2020-04-12 15:49:27
【问题描述】:

我正在尝试在颤振应用程序中下载一些文件。下载文件后,我希望能够向用户显示下载的文件及其修改日期、大小等信息。现在我正在检索这样的文件列表:

import 'dart:io' as io;

import 'package:flutter/material.dart';
import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart';

class Downloads extends StatefulWidget {
  @override
  _DownloadsState createState() => _DownloadsState();
}

class _DownloadsState extends State<Downloads> {
  String directory;
  List file = new List();
  @override
  void initState() {
    super.initState();
    _listofFiles();
  }

  void _listofFiles() async {
    directory = (await getExternalStorageDirectory()).path;
    setState(() {
      file = io.Directory("$directory/").listSync();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Downloads"),
      ),
      body: GridView.builder(
          padding: EdgeInsets.all(10),
          gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              mainAxisSpacing: 10,
              crossAxisSpacing: 10,
              childAspectRatio: 0.9),
          itemCount: file.length,
          itemBuilder: (context, i) {
            print(file[i]);
            return GestureDetector(
              onTap: () {
                OpenFile.open(file[i].toString());
              },
              child: Container(
                padding: EdgeInsets.all(10),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(4),
                    color: Colors.white,
                    boxShadow: [
                      BoxShadow(
                          color: Colors.grey, blurRadius: 2, spreadRadius: 2),
                    ]),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    Icon(
                      Icons.insert_drive_file,
                      size: 50,
                      color: Colors.blue,
                    ),
                    SizedBox(height: 10),
                    Text(file[i].toString())
                  ],
                ),
              ),
            );
          }),
    );
  }
}

但我只能从上面的代码中获取文件路径,而不是文件名和文件扩展名或文件大小。我如何检索这些信息?

【问题讨论】:

  • 当你有一个路径时,你可以创建一个 File 对象。 api.dart.dev/stable/2.7.2/dart-io/File-class.html 它有一个长度属性。使用一些正则表达式或 string.split,您可以自己找出名称和扩展名。
  • 虽然它确实有效,但它也有一些缺陷。就像它返回路径一样[文件:'/storage/emulated/0/Android/data/com.example.test_app/files/picture.jpg']。所以它不完全是路径。而且我没有得到大小和修改日期等信息。
  • 这对我来说似乎是一条路。您正在调用 File 对象上的字符串。您必须调用 .path.absolute 才能将路径作为字符串。也许一般的 dart 教程可以帮助你在深入了解 Flutter 之前理解这些概念。看看:dart.dev/tutorials/server/cmdline
  • 是的,我能够弄清楚。目录返回 FileSystemEntity ,它不是 File 对象。一旦我做了“是文件”检查,我就能够从返回的字符串中检索路径。谢谢。
  • 我尝试运行您的示例代码,但只得到this。看来您已经解决了错误。如果您能提供解决方案并接受它作为答案,那就太好了。

标签: flutter dart


【解决方案1】:

您可以使用FileSystemEntity 通过FileStat 获取文件的元数据。按照类似的步骤here 将 FileSystemEntity 投射到目录中的文件上。

使用正则表达式过滤支持的文件扩展名。

List<FileSystemEntity> listFiles = [];
_fetchFiles(Directory dir) {
  dir.list().forEach((element) {
    RegExp regExp =
        new RegExp("\.(gif|jpe?g|tiff?|png|webp|bmp)", caseSensitive: false);
    debugPrint('dir contains: $element is image? ${regExp.hasMatch('$element')}');
    // Only add in List if file in path is supported
    if (regExp.hasMatch('$element')) {
      listFiles.add(element);
    }   
  });
}

要从 FileSystemEntity 获取 FileStat,可以调用 FileSystemEntity.stat()

listFiles[index].stat().then((FileStat stat){
  // Access file metadata using FileStat 
  // https://api.flutter.dev/flutter/dart-io/FileStat-class.html
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2018-09-19
    • 2012-02-08
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多