• 设为首页
  • 收藏本站
  • 手机版
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 扫一扫,访问微社区

    登录 加入我们
  • 查看: 780|回复: 0

    Ceylon文件操作

    [复制链接]

    10

    主题

    14

    帖子

    103

    积分

    注册会员

    Rank: 2

    积分
    103
    QQ
    发表于 2018-5-5 13:28:40 | 显示全部楼层 |阅读模式
    本帖最后由 PECman 于 2019-2-13 23:28 编辑

    Ceylon文件操作:
    首先,导入ceylon.file包。之后让我们看一下利用这个包都能进行哪些操作:
    (依据官网相关文档:https://modules.ceylon-lang.org/ ... -doc/api/index.html)
    1.初始化文件(夹)地址(需要函数parsePath(), 它将返回一个Path对象)
    2.创建文件并向其写入
    3.从文件读取内容
    4.重命名文件(嵌套操作)
    5.打印文件夹下所有文件及文件夹的地址(实战篇,包括隐藏文件)
    6.创建压缩文件并将任意文件压缩

    1.初始化文件地址:
    1. value path = parsePath("C:\\Users\\Administrator\\Desktop");
    2. value child = path.childPath("hello.txt");
    3. value sibling = child.siblingPath("goodbye.txt");
    4. value parent = path.parent;
    复制代码
    现在,path代表着一个文件夹地址,指向我们的桌面(如果你是以管理员身份登录的,且在Windows操作系统下),而child这个Path对象也指向一个地址,即桌面下一个名为hello.txt的文本文件(这个文件不一定存在,仅仅是代表这个文件),sibling亦同。siblingPath这个函数的意思是将某一地址的最后一个文件(夹)替换为给定的文件(夹)。path.parent即path的父目录。这几个函数都很常用也很使用,大家不需要死记硬背,视其为工具即可。
    (*
    注意: 任何Path对象都可以在打印时转成String类型
    所以我们如果想打印path指向的地址,可以直接这样写:
    1. print(path);
    复制代码
    *)

    2.创建文件并向其写入:
    1. value filePath = path.childPath("hello.txt");
    2. if (is Nil loc = filePath.resource) {
    3.     value file = loc.createFile();
    4.     try (writer = file.Overwriter()) {
    5.         writer.writeLine("Hello, World!");
    6.     }
    7. }
    8. else {
    9.     print("file already exists");
    10. }
    复制代码
    在分析这段代码前,让我们先了解几个概念:
    • File 包含了文件数据
    • Directory 包含文件或文件夹的资源
    • Link 表示着一个已经确定的资源
    • Nil 代表着文件系统中一个可以安全创建资源且未被占用的位置。
    这段代码先声明了一个指向桌面下名为hello.txt文件的地址,紧接着判断这个地址指向的文件是否存在(或者说是不是可以在filePath.resource指向的地方创建文件)。如果存在(即不能创建文件,也就是已经有文件了),打印 文件已存在;如果不存在,就依据filePath.resource所指向的地方创建文件并声明代表该文件的变量。

    之后我们就引用了一个写入器(注意是overwriter,即重写。先抹去原先内容,之后开始写入),用try语句的原因主要是防止触发异常进而终止程序。假如没有异常,我们就向这个文件写了一行Hello, World!,注意是writeLine方法,象征着输入完内容后会换行。
    运行程序,我们会发现桌面上多了一个hello.txt文件,打开后发现里面写着一行Hello, World!。


    3.从文件读取内容:
    输出我们刚刚写入文件的内容,只需要这样写:
    1. value filePath = path.childPath("hello.txt");
    2. if (is File file = filePath.resource) {
    3.     try (reader = file.Reader()) {
    4.         print(reader.readLine());
    5.     }
    6. }
    7. else {
    8.     print("file does not exist");
    9. }
    复制代码
    初始化Path对象我就不说了,之后就是判断该资源是否为文件,如果是就引用读取器,接着就把读取到的一行打印出来,不必多说,肯定是Hello, World!

    4.重命名文件(嵌套操作):
    先亮代码,看看你能不能看懂什么是嵌套操作。我之所以把它称作嵌套操作,是因为官方并没有提供一个函数直接完成该操作。
    1. value filePath = path.childPath("hello.txt");
    2. if (is File file = filePath.resource) {
    3.     value newPath = filePath.siblingPath("goodbye.txt");
    4.     if (is Nil loc = newPath.resource) {
    5.        file.move(loc);
    6.     }
    7.     else {
    8.         print("target file already exists");
    9.     }
    10. }
    11. else {
    12.     print("source file does not exist");
    13. }
    复制代码
    概括地说:先获得要更名的文件的地址,将它指向的文件作为临时局部变量file,之后再更改地址指向同文件夹下的另一文件(可能不存在),如果不存在,就创建这个文件,之后把file移动(move)到该文件中。

    5.打印文件夹下所有文件及文件夹的地址:
    1. if (is Directory dir = path.resource) {
    2.     for (path in dir.childPaths()) {
    3.         print(path);
    4.     }
    5. }
    6. else {
    7.     print("directory does not exist");
    8. }
    复制代码
    主要思路就是通过childPaths函数获得所以子文件(夹)的地址,之后遍历输出。大家有兴趣可以看一下这个小项目。
    项目地址:https://gitee.com/pecman/learnin ... ileList_test.ceylon


    6.创建压缩文件并将任意文件压缩:
    1. value zipPath = path.childPath("myzip.zip");
    2. if (is Nil|File loc = zipPath.resource) {
    3.     value zipSystem = createZipFileSystem(loc);
    4.     value entryPath = zipSystem.parsePath("/hello.txt");
    5.     if (is Nil entry = entryPath.resource) {
    6.         value filePath = path.childPath("hello.txt");
    7.         if (is File file = filePath.resource) {
    8.             file.copy(entry);
    9.         }
    10.         else {
    11.             print("source file does not exist");
    12.         }
    13.     }
    14.     else {
    15.         print("entry already exists");
    16.     }
    17.     zipSystem.close();
    18. }
    复制代码
    这个操作就比较"凶"了,“value zipSystem = createZipFileSystem(loc);”这一行创建了一个压缩文件系统,之后在该系统中新建文件hello.txt,再把电脑中的hello.txt复制到这个文件里(跨文件系统操作)。就酱 :-P





    分享到:
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    Archiver|手机版|小黑屋|ceylon中文论坛 Powered by Discuz! X3.4 © 2001-2017 Comsenz Inc.

    快速回复 快速发帖 返回顶部 返回列表