哔哩哔哩:https://www.bilibili.com/video/BV16yfiYREwZ/
文件系统 –
一次性的文件读写可以直接使用files.read()
, files.write()
, files.append()
等方便的函数
但如果需要频繁读写或随机读写,则使用open()
函数打开一个文件对象来操作文件,并在操作完毕后调用close()
函数关闭文件。
1、了解文件路径
files.getSdcardPath()
- 返回 {string}
返回SD卡路径。所谓SD卡,即外部存储器。
files.cwd()
- 返回 {string}
返回脚本的”当前工作文件夹路径”。该路径指的是,如果脚本本身为脚本文件,则返回这个脚本文件所在目录;否则返回null
获取其他设定路径。
例如,对于脚本文件”/sdcard/脚本/1.js”运行files.cwd()
返回”/sdcard/脚本/”。
files.join(parent, child)
parent
{string} 父目录路径child
{string} 子路径- 返回 {string}
连接两个路径并返回,例如files.join("/sdcard/", "1.txt")
返回”/sdcard/1.txt”。
files.path(relativePath)
relativePath
{string} 相对路径- 返回 {string}
返回相对路径对应的绝对路径。例如files.path("./1.png")
,如果运行这个语句的脚本位于文件夹”/sdcard/脚本/”中,则返回"/sdcard/脚本/1.png"
。
2、判断文件或者文件夹命令
files.isFile(path)
path
{string} 路径- 返回 {boolean}
返回路径path是否是文件。
log(files.isFile("/sdcard/文件夹/")); //返回false
log(files.isFile("/sdcard/文件.txt")); //返回true
files.isDir(path)
path
{string} 路径- 返回 {boolean}
返回路径path是否是文件夹。
log(files.isDir("/sdcard/文件夹/")); //返回true
log(files.isDir("/sdcard/文件.txt")); //返回false
files.isEmptyDir(path)
path
{string} 路径- 返回 {boolean}
返回文件夹path是否为空文件夹。如果该路径并非文件夹,则直接返回false
。
files.exists(path)
path
{string} 路径- 返回 {boolean}
返回在路径path处的文件或者文件夹是否存在。
files.ensureDir(path)
path
{string} 路径
确保路径path所在的文件夹存在。如果该路径所在文件夹不存在,则创建该文件夹。
例如对于路径”/sdcard/Download/ABC/1.txt”,如果/Download/文件夹不存在,则会先创建Download,再创建ABC文件夹。
3、操作文件文件夹命令
files.create(path)
path
{string} 路径- 返回 {boolean}
创建一个文件或文件夹并返回是否创建成功。如果文件已经存在,则直接返回false
。
files.create("/sdcard/新文件夹/");
files.createWithDirs(path)
path
{string} 路径- 返回 {boolean}
创建一个文件或文件夹并返回是否创建成功。如果文件所在文件夹不存在,则先创建他所在的一系列文件夹。如果文件已经存在,则直接返回false
。
files.createWithDirs("/sdcard/新文件夹/新文件夹/新文件夹/1.txt")
files.copy(fromPath, toPath)
fromPath
{string} 要复制的原文件路径toPath
{string} 复制到的文件路径- 返回 {boolean}
复制文件,返回是否复制成功。例如files.copy("/sdcard/1.txt", "/sdcard/Download/1.txt")
。
files.move(fromPath, toPath)
fromPath
{string} 要移动的原文件路径toPath
{string} 移动到的文件路径- 返回 {boolean}
移动文件,返回是否移动成功。例如files.move("/sdcard/1.txt", "/sdcard/Download/1.txt")
会把1.txt文件从sd卡根目录移动到Download文件夹。
files.rename(path, newName)
path
{string} 要重命名的原文件路径newName
{string} 要重命名的新文件名- 返回 {boolean}
重命名文件,并返回是否重命名成功。例如files.rename("/sdcard/1.txt", "2.txt")
。
files.renameWithoutExtension(path, newName)
path
{string} 要重命名的原文件路径newName
{string} 要重命名的新文件名- 返回 {boolean}
重命名文件,不包含拓展名,并返回是否重命名成功。例如files.rename("/sdcard/1.txt", "2")
会把”1.txt”重命名为”2.txt”。
files.getName(path)
path
{string} 路径- 返回 {string}
返回文件的文件名。例如files.getName("/sdcard/1.txt")
返回”1.txt”。
files.getNameWithoutExtension(path)
path
{string} 路径- 返回 {string}
返回不含拓展名的文件的文件名。例如files.getName("/sdcard/1.txt")
返回”1″。
files.getExtension(path)
path
{string} 路径- 返回 {string}
返回文件的拓展名。例如files.getExtension("/sdcard/1.txt")
返回”txt”。
files.remove(path)
path
{string} 路径- 返回 {boolean}
删除文件或空文件夹,返回是否删除成功。
files.removeDir(path)
path
{string} 路径path
{string} 路径- 返回 {boolean}
删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹,返回是否全部删除成功。
4、遍历文件
files.listDir(path[, filter])
path
{string} 路径filter
{Function} 过滤函数,可选。接收一个string
参数(文件名),返回一个boolean
值。
列出文件夹path下的满足条件的文件和文件夹的名称的数组。如果不加filter参数,则返回所有文件和文件夹。
列出sdcard目录下所有文件和文件夹为:
var arr = files.listDir("/sdcard/");
log(arr);
列出脚本目录下所有js脚本文件为:
var dir = "/sdcard/脚本/";
var jsFiles = files.listDir(dir, function(name){
return name.endsWith(".js") && files.isFile(files.join(dir, name));
});
log(jsFiles);
5、读取文件
files.read(path[, encoding = “utf-8”])
path
{string} 路径encoding
{string} 字符编码,可选,默认为utf-8- 返回 {string}
读取文本文件path的所有内容并返回。如果文件不存在,则抛出FileNotFoundException
。
log(files.read("/sdcard/1.txt"));
files.readBytes(path)
path
{string} 路径- 返回 {byte[]}
读取文件path的所有内容并返回一个字节数组。如果文件不存在,则抛出FileNotFoundException
。
注意,该数组是Java的数组,不具有JavaScript数组的forEach, slice等函数。
一个以16进制形式打印文件的例子如下:
var data = files.readBytes("/sdcard/1.png");
var sb = new java.lang.StringBuilder();
for(var i = 0; i < data.length; i++){
sb.append(data[i].toString(16));
}
log(sb.toString());
6、写入文件
files.write(path, text[, encoding = “utf-8”])
path
{string} 路径text
{string} 要写入的文本内容encoding
{string} 字符编码
把text写入到文件path中。如果文件存在则覆盖,不存在则创建。
var text = "文件内容";
//写入文件
files.write("/sdcard/1.txt", text);
//用其他应用查看文件
app.viewFile("/sdcard/1.txt");
files.writeBytes(path, bytes)
path
{string} 路径bytes
{byte[]} 字节数组,要写入的二进制数据
把bytes写入到文件path中。如果文件存在则覆盖,不存在则创建。
files.append(path, text[, encoding = ‘utf-8’])
path
{string} 路径text
{string} 要写入的文本内容encoding
{string} 字符编码
把text追加到文件path的末尾。如果文件不存在则创建。
var text = "追加的文件内容";
files.append("/sdcard/1.txt", text);
files.append("/sdcard/1.txt", text);
//用其他应用查看文件
app.viewFile("/sdcard/1.txt");
files.appendBytes(path, bytes[, encoding = ‘utf-8’])
path
{string} 路径bytes
{byte[]} 字节数组,要写入的二进制数据
把bytes追加到文件path的末尾。如果文件不存在则创建。
7、打开文件获取文件对象
open(path[, mode = “r”, encoding = “utf-8”, bufferSize = 8192)
path
{string} 文件路径,例如”/sdcard/1.txt”。- mode{string} 文件打开模式,包括:
- “r”: 只读文本模式。该模式下只能对文件执行文本读取操作。
- “w”: 只写文本模式。该模式下只能对文件执行文本覆盖写入操作。
- “a”: 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
- “rw”: 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。
目前暂不支持二进制模式,随机读写模式。
encoding
{string} 字符编码。bufferSize
{number} 文件读写的缓冲区大小。
打开一个文件。根据打开模式返回不同的文件对象。包括:
- “r”: 返回一个ReadableTextFile对象。
- “w”, “a”: 返回一个WritableTextFile对象。
对于”w”模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容;
其他模式文件不存在会抛出FileNotFoundException。
8、ReadableTextFile可读文件对象
ReadableTextFile.read()
返回该文件剩余的所有内容的字符串。
ReadableTextFile.read(maxCount)
maxCount
{Number} 最大读取的字符数量
读取该文件接下来最长为maxCount的字符串并返回。即使文件剩余内容不足maxCount也不会出错。
ReadableTextFile.readline()
读取一行并返回(不包含换行符)。
ReadableTextFile.readlines()
读取剩余的所有行,并返回它们按顺序组成的字符串数组。
close()
关闭该文件。
打开一个文件不再使用时务必关闭
9、PWritableTextFile可写文件对
PWritableTextFile.write(text)
text
{string} 文本
把文本内容text写入到文件中。
PWritableTextFile.writeline(text)
text
{string} 文本
把文本line写入到文件中并写入一个换行符。
PWritableTextFile.writelines(lines)
lines
{Array} 字符串数组
把很多行写入到文件中….
PWritableTextFile.flush()
把缓冲区内容输出到文件中。
PWritableTextFile.close()
关闭文件。同时会被缓冲区内容输出到文件。
打开一个文件写入后,不再使用时务必关闭,否则文件可能会丢失
– 示例代码 –
1、读取文本文件
//文件路径
var path = "/sdcard/1.txt";
//打开文件
var file = open(path);
//读取文件的所有内容
var text = file.read();
//打印到控制台
print(text);
//关闭文件
file.close();
console.show();
2、读写文本文件
//以写入模式打开SD卡根目录文件1.txt
var file = open("/sdcard/1.txt", "w")
//写入aaaa
file.write("aaaa");
//写入bbbbb后换行
file.writeline("bbbbb");
//写入ccc与ddd两行
file.writelines(["ccc", "ddd"]);
//关闭文件
file.close();
//以附加模式打开文件
file = open("/sdcard/1.txt", "a");
//附加一行"啦啦啦啦"
file.writeline("啦啦啦啦");
//附加一行"哈哈哈哈"
file.writeline("哈哈哈哈");
//附加两行ccc, ddd
file.writelines(["ccc", "ddd"]);
//输出缓冲区
file.flush();
//关闭文件
file.close();
//以读取模式打开文件
file = open("/sdcard/1.txt", "r")
//读取一行并打印
var arr = file.readlines();
//读取剩余所有行并打印
arr.forEach(line => {
print(line)
})
file.close()
//显示控制台
console.show()
3、删除所有空文件夹
if(confirm("该操作会删除SD卡目录及其子目录下所有空文件夹,是否继续?")){
toast("请点击右上角打开日志");
deleteAllEmptyDirs(files.getSdcardPath());
toast("全部完成!");
}
function deleteAllEmptyDirs(dir){
var list = files.listDir(dir);
var len = list.length;
if(len == 0){
log("删除目录 " + dir + " " + (files.remove(dir) ? "成功" : "失败"));
return;
}
for(let i = 0; i < len; i++){
var child = files.join(dir, list[i]);
if(files.isDir(child)){
deleteAllEmptyDirs(child);
}
}
}
4、文件编码转换
//以UTF-8编码打开SD卡上的1.txt文件
var f = open("/sdcard/1.txt", "r", "utf-8");
//读取文件所有内容
var text = f.read();
//关闭文件
f.close();
//以gbk编码打开SD卡上的2.txt文件
var out = open("/sdcard/2.txt", "w", "gbk");
//写入内容
out.write(text);
//关闭文件
out.close();
5、文件编码转换(高级)
convert("/sdcard/1.txt", "utf-8", "/sdcard/2.txt", "gbk");
/**
* fromFile: 源文件路径
* fromEncoding: 源文件编码
* toFile: 输出文件路径
* toEncoding: 输出文件编码
*/
function convert(fromFile, fromEncoding, toFile, toEncoding){
fromFile = open(fromFile, "r", fromEncoding);
toFile = open(toFile, "w", toEncoding);
while(true){
var line = fromFile.readline();
if(!line)
break;
toFile.writeline(line);
}
fromFile.close()
toFile.close()
}
6、写入文本文件
//文件路径
var path = "/sdcard/1.txt";
//要写入的文件内容
var text = "Hello, AutoJs";
//以写入模式打开文件
var file = open(path, "w");
//写入文件
file.write(text);
//关闭文件
file.close();