#
第五章 使用文件
# 使用文件
`%Library.File`类提供了几个类方法,允许对文件执行各种操作。
## 复制文件
若要复制文件,请使用`CopyFile()`方法,该方法返回一个布尔值来指示成功或失败。
此方法采用四个参数:
1. from 从—指定源文件的名称。
2. to至—指定目标文件的名称。
3. pDeleteBeforeCopy —指定在执行复制之前是否删除目标文件(如果存在)。默认值为0。
4. return 返回—输出参数。如果为负,则包含操作系统返回的错误代码,以防方法失败
下面的第一个示例将目录`e:\temp`中的文件`old.txt`复制到`new.txt`。第二个示例将相同的文件复制到默认目录中的`new.txt`。
```java
DHC-APP>write ##class(%File).CopyFile("e:\temp\old.txt", "e:\temp\new.txt", 0, .return)
1
DHC-APP>write ##class(%File).CopyFile("e:\temp\old.txt", "new.txt", 0, .return)
1
```
最后一个示例失败,Windows错误代码为2,或“找不到文件”
```java
DHC-APP>write ##class(%File).CopyFile("foo.txt", "new.txt", 0, .return)
0
DHC-APP>w return
-2
```
## 删除文件
要删除文件,请使用`delete()`方法,该方法成功时返回1,失败时返回0。这个方法需要两个参数。第一个参数是要删除的文件的名称。第二个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
在下面的第一个示例中,方法成功了。第二个示例失败,出现Windows错误代码2或“找不到文件”。
```java
DHC-APP>write ##class(%File).Delete("e:\temp\myfile.txt", .return)
1
DHC-APP>write ##class(%File).Delete("e:\temp\myfile.txt", .return)
0
DHC-APP>w return
-2
```
要在删除文件时匹配通配符,请使用`ComplexDelete()`方法。第一个参数指定要删除的文件的名称。第二个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
下面的示例删除所有带有。`e:\temp`目录中的out扩展名。
```java
DHC-APP>write ##class(%File).ComplexDelete("e:\temp\*.out", .return)
1
```
## 截断文件
要截断文件,请使用`truncate()`方法,该方法成功时返回1,失败时返回0。这个方法需要两个参数。第一个参数是要截断的文件的名称。第二个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
如果截断现有文件,方法会从文件中删除内容,但不会从文件系统中删除内容。如果截断不存在的文件,方法会创建一个新的空文件。
在下面的第一个示例中,方法成功了。第二个示例失败,Windows错误代码为5,或“访问被拒绝”
```java
USER>write ##class(%File).Truncate("e:\temp\myfile.txt", .return)
1
USER>write ##class(%File).Truncate("e:\no access.txt", .return)
0
USER>write return
-5
```
## 重命名文件
若要重命名文件,请使用`rename()`方法,该方法成功时返回1,失败时返回0。这个方法需要三个参数。第一个参数是要重命名的文件的名称,第二个参数是新名称。第三个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
在下面的第一个示例中,方法成功了。第二个示例失败,错误代码为183,或者“当文件已经存在时,无法创建该文件。”
```java
DHC-APP>write ##class(%File).Rename("e:\temp\oldname.txt", "e:\temp\newname.txt", .return)
1
DHC-APP>write ##class(%File).Rename("e:\temp\another.txt", "e:\temp\newname.txt", .return)
0
DHC-APP>write return
-2
```
使用此方法时,请小心指定路径,因为以下示例会将`e:\temp\oldname.txt`移动到默认目录,然后将其重命名为`newname.txt`。
```java
DHC-APP>write ##class(%File).Rename("e:\temp\oldname.txt", "newname.txt", .return)
1
```
## 比较文件
若要比较两个文件,请使用`Compare()`方法,如果两个文件相同,则返回布尔值1,否则返回0。该方法没有用于返回系统错误代码的输出参数。
在下面的第一个示例中,两个文件是相同的,方法返回1。在第二个示例中,两个文件不同,因此方法返回0。
```java
DHC-APP>write ##class(%File).Compare("e:\temp\old.txt", "e:\temp\new.txt")
1
DHC-APP>write ##class(%File).Compare("e:\temp\old.txt", "e:\temp\another.txt")
0
```
如果一个或两个文件都不存在,如下例所示,则该方法也返回0。
```java
DHC-APP>write ##class(%File).Compare("foo.txt", "bar.txt")
0
DHC-APP>write ##class(%File).Exists("foo.txt")
0
```
## 生成临时文件
要生成临时文件,请使用`TempFilename()`方法,该方法返回临时文件的名称。这个方法需要三个参数。第一个参数是临时文件所需的文件扩展名。第二个是生成临时文件的目录。如果未提供,该方法将在操作系统提供的临时目录中生成文件。第三个参数是输出参数。如果为负,它包含操作系统返回的错误代码,以防方法失败。
Windows示例:
```java
USER>write ##class(%File).TempFilename("txt")
C:\WINDOWS\TEMP\GATqk8a6.txt
USER>write ##class(%File).TempFilename("txt","C:\temp")
C:\temp\WpSwuLlA.txt
```
Unix示例:
```java
USER>write ##class(%File).TempFilename("", "", .return)
/tmp/filsfHGzc
USER>write ##class(%File).TempFilename("tmp", "/InterSystems/temp", .return)
/InterSystems/temp/file0tnuh.tmp
USER>write ##class(%File).TempFilename("", "/tmp1", .return)
USER>write return
-2
```
在上面的第三个示例中,目录不存在,该方法失败,系统错误代码为2,或“没有这样的文件或目录。”