为了账号安全,请及时绑定邮箱和手机立即绑定

检查目录及其内容是否被锁定的最佳方法是什么?

检查目录及其内容是否被锁定的最佳方法是什么?

呼啦一阵风 2021-09-15 14:55:32
假设我将一个包含目录路径的字符串传递给一个随机方法。在此方法开始工作之前,它应该检查目录或其任何内容是否被锁定。我认为这将是一项简单的任务,但结果我得到了一些几乎不简单的代码来完成它。你有什么建议如何改进它或至少让它更短吗?如果您认为这已经是最好的解决方案,请投赞成票并继续解决实际问题:Ppublic static boolean checkLocks(String path) {    File f = new File(path);    if(f.isDirectory()) {        boolean ans = true;;        String files[] = f.list();        for (String file : files) {            File ff = new File(f, file);            ans = checkLocks(ff.toString());            if(!ans){                break;            }        }        return ans;    } else {        try {            RandomAccessFile stream = new RandomAccessFile(path, "rw");            FileChannel channel = stream.getChannel();            FileLock lock = null;            try {                lock = channel.tryLock();            } catch (final OverlappingFileLockException e) {                stream.close();                channel.close();                System.out.println("File at "+path+" locked");                return false;            }            stream.close();            channel.close();            return true;        } catch (IOException eio) {            System.out.println("File at "+path+" does not exits");            return false;        }    }}
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我建议您使用 SimpleFileVistor 类而不是编写代码来遍历目录。


在 Files 类中已经有内置的方法来遍历目录。


Files.walkFileTree(path, MyFileVisitor)

您可以创建一个客户访问者类,如


public class MyFileVisitor  extends SimpleFileVisitor<Path>{



    @Override

    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)

            throws IOException {

        System.out.println("Visit  the File")

      return FileVisitResult.CONTINUE;

    }


    @Override

    public FileVisitResult visitFileFailed(Path file, IOException exc)

            throws IOException {

        System.out.println("File Visit Failed")

      return FileVisitResult.CONTINUE;

    }

}

这可以提高您的代码可读性并且不那么冗长。


查看完整回答
反对 回复 2021-09-15
?
慕的地10843

TA贡献1785条经验 获得超8个赞

检查目录中的每个文件让我觉得很慢并且容易出现竞争条件。在您的示例中,您会立即获得目录中的文件列表,然后对每个文件进行测试;同时,创建者线程可能仍在添加文件。即使列表中的每个文件都可以访问,创建者也可能没有完成目录的写入。


它有点老派,不是很花哨,但我会在创建过程中使用临时目录名称,或者将锁定文件写为第一个文件,并在创建者完成后将其删除。


在第一种情况下:


String baseDirectory = "{whatever}";

String workDirectory = "workDirectory" + counter;

Path tempPath = FileSystems.getDefault().getPath(baseDirectory, ".temp_" + workDirectory);

Path workPath = FileSystems.getDefault().getPath(baseDirectory, workDirectory);

Files.createDirectory(tempPath);

// Write the contents of the directory.

// [...]

Files.move(tempPath, workPath, CopyOptions.ATOMIC_MOVE);

在第二种情况下:


String baseDirectory = "{whatever}";

String workDirectory = "workDirectory" + counter;

Path workPath = FileSystems.getDefault().getPath(baseDirectory, workDirectory);

Files.createDirectory(workPath);

Path lockFile = workPath.resolve("LOCKFILE");

Files.createFile(lockFile);

// Write the contents of the directory.

// [...]

Files.delete(lockFile);

这两种情况的想法是,创建者任务在完成创建目录时明确发出信号。如果您只是等待操作暂停,它可能只是在等待通过网络加载大缓冲区。


查看完整回答
反对 回复 2021-09-15
?
MMTTMM

TA贡献1869条经验 获得超4个赞

我认为最简单的方法是使用Files类及其is*方法,如isReadableand isWritable。


if (Files.isReadable(new File(filepath).toPath()) &&

    Files.isWritable(new File(filepath).toPath()))

{

    /* do something... */

}

应该适用于常规文件和文件夹。


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信