Flutter开发之——文件系统目录pathprovider

一 概述

  • 不同的平台对应的文件系统是不同的,比如文件路径,因此 Flutter 中获取文件路径需要原生支持
  • 通过Google 官方提供的插件 path_provider,可以实现跨平台下文件的路径

二 path_provider

2.1 插件地址

  • pub 地址:https://pub.flutter-io.cn/packages/path_provider
  • Github 地址:https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider

2.2 插件安装

切换到终端模式下,执行如下指令

flutter pub add path_provider

点击pubspec.yaml右上角的Pub get或者执行如下指令

flutter pub get

三 文件路径

path_provider.dart文件下提供了8中获取文件路径的方法

3.1 getTemporaryDirectory

  • 临时目录,适用于下载的缓存文件,此目录随时可以清除
  • 此目录为应用程序私有目录,其他应用程序无法访问此目录
  • Android 上对应getCacheDir;iOS上对应NSCachesDirectory

3.2 getApplicationSupportDirectory

  • 应用程序可以在其中放置应用程序支持文件的目录的路径
  • 将此文件用于您不想向用户公开的文件。 您的应用不应将此目录用于存放用户数据文件
  • 在iOS上,对应NSApplicationSupportDirectory ,如果此目录不存在,则会自动创建。 在Android上,对应getFilesDir

3.3 getLibraryDirectory

  • 应用程序可以在其中存储持久性文件,备份文件以及对用户不可见的文件的目录路径
  • 在Android上,此函数抛出[UnsupportedError]异常,没有等效项路径存在

3.4 getApplicationDocumentsDirectory

  • 应用程序可能在其中放置用户生成的数据或应用程序无法重新创建的数据的目录路径
  • 在iOS上,对应NSDocumentDirectory API。 如果数据不是用户生成的,考虑使用[getApplicationSupportDirectory]
  • 在Android上,对应getDataDirectory API。 如果要让用户看到数据,请考虑改用[getExternalStorageDirectory]

3.5 getExternalStorageDirectory

  • 应用程序可以访问顶级存储的目录的路径
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会引发[UnsupportedError]异常,因为无法在应用程序的沙箱外部访问
  • 在Android上,对应getExternalFilesDir(null)

3.6 getExternalCacheDirectories

  • 存储特定于应用程序的外部缓存数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问。
  • 在Android上,对应Context.getExternalCacheDirs()或API Level 低于19的Context.getExternalCacheDir()

3.7 getExternalStorageDirectories

  • 可以存储应用程序特定数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上。
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问
  • 在Android上,对应Context.getExternalFilesDirs(String type)或API Level 低于19的Context.getExternalFilesDir(String type)

3.8 getDownloadsDirectory

  • 存储下载文件的目录的路径,这通常仅与台式机操作系统有关
  • 在Android和iOS上,此函数将引发[UnsupportedError]异常。

四 示例

4.1 代码

  Future<Directory?>? _tempDirectory;
  Future<Directory?>? _appSupportDirectory;
  Future<Directory?>? _appLibraryDirectory;
  Future<Directory?>? _appDocumentsDirectory;
  Future<Directory?>? _externalDocumentsDirectory;
  Future<List<Directory>?>? _externalStorageDirectories;
  Future<List<Directory>?>? _externalCacheDirectories;
  Future<Directory?>? _downloadDirectory;
  
  void _requestTempDirectory() {
    setState(() {
      _tempDirectory = getTemporaryDirectory();
    });
  }
  Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory?> snapshot) {
    Text text = const Text('');
    if (snapshot.connectionState == ConnectionState.done) {
      if (snapshot.hasError) {
        text = Text('Error: ${snapshot.error}');
      } else if (snapshot.hasData) {
        text = Text('path: ${snapshot.data!.path}');
      } else {
        text = const Text('path unavailable');
      }
    }
    return Padding(padding: const EdgeInsets.all(16.0), child: text);
  }

  Widget _buildDirectories(BuildContext context, AsyncSnapshot<List<Directory>?> snapshot) {
    Text text = const Text('');
    if (snapshot.connectionState == ConnectionState.done) {
      if (snapshot.hasError) {
        text = Text('Error: ${snapshot.error}');
      } else if (snapshot.hasData) {
        final String combined = snapshot.data!.map((Directory d) => d.path).join(', ');
        text = Text('paths: $combined');
      } else {
        text = const Text('path unavailable');
      }
    }
    return Padding(padding: const EdgeInsets.all(16.0), child: text);
  }

  void _requestAppDocumentsDirectory() {
    setState(() {
      _appDocumentsDirectory = getApplicationDocumentsDirectory();
    });
  }

  void _requestAppSupportDirectory() {
    setState(() {
      _appSupportDirectory = getApplicationSupportDirectory();
    });
  }

  void _requestAppLibraryDirectory() {
    setState(() {
      _appLibraryDirectory = getLibraryDirectory();
    });
  }

  void _requestExternalStorageDirectory() {
    setState(() {
      _externalDocumentsDirectory = getExternalStorageDirectory();
    });
  }

  void _requestExternalStorageDirectories(StorageDirectory type) {
    setState(() {
      _externalStorageDirectories = getExternalStorageDirectories(type: type);
    });
  }

  void _requestExternalCacheDirectories() {
    setState(() {
      _externalCacheDirectories = getExternalCacheDirectories();
    });
  }
  void _requestDownloadDirectory() {
    setState(() {
      _downloadDirectory = getDownloadsDirectory();
    });
  }

Center(
        child: ListView(
          children: <Widget>[
            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Temporary Directory'), onPressed: _requestTempDirectory,),),
            FutureBuilder<Directory?>(future: _tempDirectory, builder: _buildDirectory),

            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Documents Directory'),
              onPressed: _requestAppDocumentsDirectory,),),
            FutureBuilder<Directory?>(future: _appDocumentsDirectory, builder: _buildDirectory),

            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Support Directory'),
              onPressed: _requestAppSupportDirectory,),),
            FutureBuilder<Directory?>(future: _appSupportDirectory, builder: _buildDirectory),

            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Library Directory'),
              onPressed: _requestAppLibraryDirectory,)),
            FutureBuilder<Directory?>(future: _appLibraryDirectory, builder: _buildDirectory),

            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: Text(Platform.isIOS ? 'External directories are unavailable on iOS' : 'Get External Storage Directory'),
              onPressed: Platform.isIOS ? null : _requestExternalStorageDirectory,),),
            FutureBuilder<Directory?>(future: _externalDocumentsDirectory, builder: _buildDirectory),

            Column(children: <Widget>[
              Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(
                  child: Text(Platform.isIOS
                      ? 'External directories are unavailable on iOS'
                      : 'Get External Storage Directories'),
                  onPressed: Platform.isIOS ? null : () {_requestExternalStorageDirectories(StorageDirectory.music,);},
                ),
              ),
            ]),
            FutureBuilder<List<Directory>?>(future: _externalStorageDirectories, builder: _buildDirectories),

            Column(children: <Widget>[
              Padding(padding: const EdgeInsets.all(16.0),
                child: ElevatedButton(
                  child: Text(Platform.isIOS ? 'External directories are unavailable on iOS' : 'Get External Cache Directories'),
                  onPressed: Platform.isIOS ? null : _requestExternalCacheDirectories,
                ),
              ),
            ]),
            FutureBuilder<List<Directory>?>(future: _externalCacheDirectories, builder: _buildDirectories),

            Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Download Directory'), onPressed: _requestDownloadDirectory,),),
            FutureBuilder<Directory?>(future: _downloadDirectory, builder: _buildDirectory),
          ],
        ),
      )

4.2 效果图

五 参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Flutter中切换到根目录并执行操作,可以使用path_provider插件来获取文件路径。首先,确保你已经在Flutter项目中引入了path_provider插件\[1\]。然后,你可以在你的代码中使用以下方法来获取根目录的路径: ```dart import 'package:path_provider/path_provider.dart'; Future<void> switchToRootDirectory() async { // 获取应用程序的文档目录 final directory = await getApplicationDocumentsDirectory(); // 获取根目录的路径 final rootDirectory = directory.parent; // 在这里执行你的操作,切换到根目录并执行你需要的操作 // 例如,你可以使用dart:io库来执行文件操作 // Directory.current = rootDirectory; // 然后执行你的操作 // 示例代码中的Directory.current = rootDirectory;是将当前目录切换到根目录,你可以根据你的需求来执行相应的操作。 } ``` 你可以在你的代码中调用`switchToRootDirectory()`方法来切换到根目录并执行你需要的操作。请注意,你可能需要在你的代码中引入dart:io库来执行文件操作。 希望这个回答对你有帮助!如果你还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* [Flutter开发之——文件系统目录pathprovider](https://blog.csdn.net/Calvin_zhou/article/details/117295911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Futter基础第10篇: 实现替换路由、返回到根路由](https://blog.csdn.net/qq_27494201/article/details/103398527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值