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

假设我将一个包含目录路径的字符串传递给一个随机方法。在此方法开始工作之前,它应该检查目录或其任何内容是否被锁定。我认为这将是一项简单的任务,但结果我得到了一些几乎不简单的代码来完成它。你有什么建议如何改进它或至少让它更短吗?


如果您认为这已经是最好的解决方案,请投赞成票并继续解决实际问题:P


public 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;

        }

    }


}



呼啦一阵风
浏览 136回答 3
3回答

慕姐8265434

我建议您使用 SimpleFileVistor 类而不是编写代码来遍历目录。在 Files 类中已经有内置的方法来遍历目录。Files.walkFileTree(path, MyFileVisitor)您可以创建一个客户访问者类,如public class MyFileVisitor&nbsp; extends SimpleFileVisitor<Path>{&nbsp; &nbsp; @Override&nbsp; &nbsp; public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Visit&nbsp; the File")&nbsp; &nbsp; &nbsp; return FileVisitResult.CONTINUE;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public FileVisitResult visitFileFailed(Path file, IOException exc)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("File Visit Failed")&nbsp; &nbsp; &nbsp; return FileVisitResult.CONTINUE;&nbsp; &nbsp; }}这可以提高您的代码可读性并且不那么冗长。

慕的地10843

检查目录中的每个文件让我觉得很慢并且容易出现竞争条件。在您的示例中,您会立即获得目录中的文件列表,然后对每个文件进行测试;同时,创建者线程可能仍在添加文件。即使列表中的每个文件都可以访问,创建者也可能没有完成目录的写入。它有点老派,不是很花哨,但我会在创建过程中使用临时目录名称,或者将锁定文件写为第一个文件,并在创建者完成后将其删除。在第一种情况下: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);这两种情况的想法是,创建者任务在完成创建目录时明确发出信号。如果您只是等待操作暂停,它可能只是在等待通过网络加载大缓冲区。

MMTTMM

我认为最简单的方法是使用Files类及其is*方法,如isReadableand isWritable。if (Files.isReadable(new File(filepath).toPath()) &&&nbsp; &nbsp; Files.isWritable(new File(filepath).toPath())){&nbsp; &nbsp; /* do something... */}应该适用于常规文件和文件夹。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java