亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查目錄及其內容是否被鎖定的最佳方法是什么?

檢查目錄及其內容是否被鎖定的最佳方法是什么?

呼啦一陣風 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 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號