【问题标题】:How do I create a file in a directory structure that does not exist yet in Dart?如何在 Dart 中尚不存在的目录结构中创建文件?
【发布时间】:2013-03-08 09:35:48
【问题描述】:

我想创建一个文件,比如foo/bar/baz/bleh.html,但foofoo/bar/ 等目录都不存在。

我如何创建我的文件以递归方式创建所有目录?

【问题讨论】:

    标签: dart dart-io


    【解决方案1】:

    或者:

    new File('path/to/file').create(recursive: true);
    

    或者:

    new File('path/to/file').create(recursive: true)
    .then((File file) {
      // Stuff to do after file has been created...
    });
    

    递归意味着如果文件或路径不存在,那么它将被创建。见:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-io.File#id_create

    编辑:这种方式不需要调用新目录!如果您愿意,也可以以同步方式执行此操作:

    new File('path/to/file').createSync(recursive: true);
    

    【讨论】:

    • 这与@JuniperBelmont 的答案基本相同,区别在于使用create 而不是createSync。使用异步 API 并不总是更有效,因为最近的讨论表明,特别是对于不涉及耗时操作的操作(完整讨论:groups.google.com/a/dartlang.org/forum/#!topic/misc/uWy-rO5sz_k
    • 我试图在这里得到的区别是你不需要调用 new Directory 来创建不存在的目录。只需使用 true 的递归参数调用 File 上的 create 方法即可。不管怎样,我觉得它看起来有点干净
    【解决方案2】:

    以下是在 Dart 中创建、读取、写入和删除文件的方法:

    创建文件:

    import 'dart:io';
    
    main() {
     new File('path/to/sample.txt').create(recursive: true);
    }
    

    读取文件:

    import 'dart:io';
    
    Future main() async {
     var myFile = File('path/to/sample.txt');
     var contents;
     contents = await myFile.readAsString();
     print(contents);
    }
    

    写入文件:

    import 'dart:io';
    
    Future main() async {
     var myFile = File('path/to/sample.txt');
     var sink = myFile.openWrite(); // for appending at the end of file, pass parameter (mode: FileMode.append) to openWrite()
     sink.write('hello file!');
     await sink.flush();
     await sink.close();
    }
    

    删除文件:

    import 'dart:io';
    
    main() {
     new File('path/to/sample.txt').delete(recursive: true);
    }
    

    注意:从 Dart 2.7 开始,上述所有代码都可以正常工作

    【讨论】:

      【解决方案3】:

      简单代码:

      import 'dart:io';
      
      void createFileRecursively(String filename) {
        // Create a new directory, recursively creating non-existent directories.
        new Directory.fromPath(new Path(filename).directoryPath)
            .createSync(recursive: true);
        new File(filename).createSync();
      }
      
      createFileRecursively('foo/bar/baz/bleh.html');
      

      【讨论】:

      • 我很好奇您如何指定这些目录的文件权限。看起来他们不一定从父母那里继承。
      • 截至 2019 年 5 月,仍然无法使用 Dart 设置文件权限。见:github.com/dart-lang/sdk/issues/15078
      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 2014-09-27
      • 2011-02-26
      • 2019-03-07
      • 1970-01-01
      • 2016-07-06
      • 2015-05-10
      相关资源
      最近更新 更多