FileUtil.copy的文件权限问题
时间: 2024-03-09 15:46:15 浏览: 159
`FileUtil.copy`方法仅仅是将源文件的内容复制到目标文件中,不会涉及到文件权限的变更。因此,如果源文件是有读写权限的,复制到目标文件后它也会有相同的权限。
如果你希望目标文件的权限和源文件保持一致,可以在复制文件后使用`File.setExecutable()`、`File.setReadable()`、`File.setWritable()`等方法来设置目标文件的权限,例如:
```java
File sourceFile = new File("source.txt");
File targetFile = new File("target.txt");
FileUtils.copyFile(sourceFile, targetFile);
targetFile.setExecutable(sourceFile.canExecute());
targetFile.setReadable(sourceFile.canRead());
targetFile.setWritable(sourceFile.canWrite());
```
这样,目标文件的权限就和源文件一致了。
相关问题
org.apache.hadoop.fs.FileUtil 内方法详解
org.apache.hadoop.fs.FileUtil是Hadoop中的一个工具类,提供了一些常用的文件操作方法。下面是该类中一些常用方法的详解:
1. copy(FileSystem srcFS, Path src, FileSystem dstFS, Path dst, boolean deleteSource, Configuration conf):将一个文件从源文件系统复制到目标文件系统。如果deleteSource为true,则在复制成功后删除源文件。
2. listFiles(File dir):列出指定目录下的所有文件和子目录。返回值是一个File数组。
3. symlink(File target, File link):在link位置创建一个指向target的符号链接。该方法只在支持符号链接的文件系统上可用。
4. copyMerge(FileSystem srcFS, Path srcDir, FileSystem dstFS, Path dstFile, boolean deleteSource, Configuration conf, String addString):将指定目录下的所有文件合并成一个文件,并将结果存储在dstFile中。如果deleteSource为true,则在合并成功后删除源文件。addString参数是可选的,用于在每个文件之间添加一个字符串。
5. chmod(File path, String perm):更改指定路径的权限。perm参数是一个八进制数字,如“755”。
6. chown(File path, String owner, String group):更改指定路径的所有者和组。owner和group参数都是字符串类型。
7. getDU(File dir):计算指定目录中所有文件和子目录的总大小。返回值是一个long类型的数字,表示文件大小。
8. symLinkTarget(File link):返回指向指定符号链接的目标文件路径。如果link不是一个符号链接,则返回null。
9. setWritable(File path, boolean writable):设置指定路径的可写权限。
10. setReadable(File path, boolean readable):设置指定路径的可读权限。
11. setExecutable(File path, boolean executable):设置指定路径的可执行权限。
这些方法是org.apache.hadoop.fs.FileUtil类中的一部分,可以帮助你实现一些常见的文件操作。
java使用hutools工具集,实现迁移centos中的文件,并且判断每一层目录的权限,看所有者是否是gnos用户,如果不是则变更所有者为gnos。文件和目录结构如下:/nas/ytdata/TM03/rawLog/2023/04/02/abc.txt
以下是使用hutools工具集实现迁移并变更权限的Java代码:
```java
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import java.io.File;
public class FileTransfer {
public static void main(String[] args) {
String srcPath = "/nas/ytdata/TM03/rawLog/2023/04/02/abc.txt";
String dstPath = "/mnt/data/abc.txt";
String owner = "gnos";
transferFile(srcPath, dstPath, owner);
}
public static void transferFile(String srcPath, String dstPath, String owner) {
File srcFile = new File(srcPath);
if (!srcFile.exists()) {
System.out.println("源文件不存在");
return;
}
if (!srcFile.isFile()) {
System.out.println("源文件不是普通文件");
return;
}
String srcDirPath = srcFile.getParent();
int startIndex = StrUtil.indexOfIgnoreCase(srcDirPath, "/rawLog/");
if (startIndex == -1) {
System.out.println("源文件不在/rawLog/目录下");
return;
}
String dstDirPath = "/mnt/data" + srcDirPath.substring(startIndex);
File dstDir = new File(dstDirPath);
if (!dstDir.exists()) {
FileUtil.mkdir(dstDirPath);
}
if (!dstDir.isDirectory()) {
System.out.println("目标路径不是目录");
return;
}
String dstFilePath = dstDirPath + "/" + srcFile.getName();
File dstFile = new File(dstFilePath);
if (dstFile.exists()) {
System.out.println("目标文件已存在");
return;
}
FileUtil.copy(srcFile, dstFile, true);
changeOwner(dstDir, owner);
}
public static void changeOwner(File dir, String owner) {
if (!dir.exists() || !dir.isDirectory()) {
return;
}
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
changeOwner(file, owner);
} else {
String fileOwner = FileUtil.getOwner(file).getUser();
if (!owner.equals(fileOwner)) {
FileUtil.chown(file, owner);
}
}
}
}
}
```
其中,`transferFile`方法中,首先判断源文件是否存在,是否是普通文件,以及是否在`/rawLog/`目录下。如果满足条件,则计算目标路径,创建目标目录,复制文件到目标路径,并调用`changeOwner`方法变更所有者。`changeOwner`方法递归遍历目录下的所有文件和子目录,并判断每个文件的所有者是否为`gnos`,如果不是则变更所有者。
阅读全文