경로가 파일인지 디렉토리인지 Node.js 확인


380

이 작업을 수행하는 방법을 설명하는 검색 결과가 보이지 않습니다.

주어진 경로가 파일인지 디렉토리 (폴더)인지 알 수 있습니다.

답변:


609

fs.lstatSync(path_string).isDirectory()당신에게 말해야합니다. 로부터 문서 :

fs.stat () 및 fs.lstat ()에서 반환 된 객체는이 유형입니다.

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

노트:

용액 상술 것 경우; 예를 들어, 또는 존재하지 않습니다.throwErrorfiledirectory

true또는 false접근 방식 을 원한다면 fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();아래 주석에서 Joseph이 언급 한대로 시도 하십시오.


18
일반적인 앱 성능에 관심이있는 경우 일반적으로 비동기 버전이 선호됩니다.
AlexMA

45
디렉토리 나 파일이 존재하지 않으면 오류가 다시 발생합니다.
Ethan Mick

9
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
Jossef Harush

파일이나 디렉토리가 존재하지 않으면 예외가 발생하여 예외가 발생하고 그렇지 않으면 비정상 종료가 발생합니다.
Sergey Kuznetsov

59

업데이트 : Node.Js> = 10

새로운 fs.promises API를 사용할 수 있습니다

const fs = require('fs').promises;

(async() => {
    const stat = await fs.lstat('test.txt');
    console.log(stat.isFile());
})().catch(console.error)

모든 Node.Js 버전

경로가 파일 또는 디렉토리인지 비동기 적으로 감지하는 방법은 노드에서 권장되는 방법입니다. fs.lstat 사용

const fs = require("fs");

let path = "/path/to/something";

fs.lstat(path, (err, stats) => {

    if(err)
        return console.log(err); //Handle error

    console.log(`Is file: ${stats.isFile()}`);
    console.log(`Is directory: ${stats.isDirectory()}`);
    console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
    console.log(`Is FIFO: ${stats.isFIFO()}`);
    console.log(`Is socket: ${stats.isSocket()}`);
    console.log(`Is character device: ${stats.isCharacterDevice()}`);
    console.log(`Is block device: ${stats.isBlockDevice()}`);
});

동기식 API를 사용할 때 참고하십시오.

동기식을 사용하면 예외가 즉시 발생합니다. try / catch를 사용하여 예외를 처리하거나 버블 링 할 수 있습니다.

try{
     fs.lstatSync("/some/path").isDirectory()
}catch(e){
   // Handle error
   if(e.code == 'ENOENT'){
     //no such file or directory
     //do something
   }else {
     //do something else
   }
}

이것이 2020 년 3 월 현재 실험적인 것으로 간주됩니까? 우리는 어디에서 볼 수 있습니까? -위의 링크를 클릭하면 이제 안정적입니다 (더 이상 실험하지 않음).
alfreema

20

진지하게, 질문은 5 년 동안 존재하지만 좋은 외관은 없습니까?

function is_dir(path) {
    try {
        var stat = fs.lstatSync(path);
        return stat.isDirectory();
    } catch (e) {
        // lstatSync throws an error if path doesn't exist
        return false;
    }
}

14

필요에 따라 노드의 path모듈 에 의존 할 수 있습니다 .

파일 시스템에 도달하지 못할 수 있습니다 (예 : 파일이 아직 생성되지 않은 경우). 실제로 추가 검증이 필요하지 않으면 파일 시스템에 충돌하지 않도록하려고합니다. 확인하려는 내용이 .<extname>형식 을 따르는 것으로 가정 할 수 있다면 이름을 확인하십시오.

분명히 extname이없는 파일을 찾는 경우 파일 시스템을 쳐서 확인해야합니다. 그러나 더 복잡해질 때까지 간단하게 유지하십시오.

const path = require('path');

function isFile(pathItem) {
  return !!path.extname(pathItem);
}

2
분명히 이것은 모든 상황에서 작동하지는 않지만 필요한 가정을 할 수 있다면 다른 답변보다 훨씬 빠르고 쉽습니다.
electrovir

1

위의 답변은 파일 시스템에 파일 또는 디렉토리 경로가 포함되어 있는지 확인합니다. 그러나 주어진 경로 만 파일 또는 디렉토리인지 식별하지 못합니다.

답은 "/"를 사용하여 디렉토리 기반 경로를 식별하는 것입니다. -> "/ c / dos / run /."과 같이 <-후행.

아직 작성되지 않은 디렉토리 또는 파일의 경로와 같습니다. 또는 다른 컴퓨터의 경로입니다. 또는 동일한 이름의 파일과 디렉토리가 모두 존재하는 경로입니다.

// /tmp/
// |- dozen.path
// |- dozen.path/.
//    |- eggs.txt
//
// "/tmp/dozen.path" !== "/tmp/dozen.path/"
//
// Very few fs allow this. But still. Don't trust the filesystem alone!

// Converts the non-standard "path-ends-in-slash" to the standard "path-is-identified-by current "." or previous ".." directory symbol.
function tryGetPath(pathItem) {
    const isPosix = pathItem.includes("/");
    if ((isPosix && pathItem.endsWith("/")) ||
        (!isPosix && pathItem.endsWith("\\"))) {
        pathItem = pathItem + ".";
    }
    return pathItem;
}
// If a path ends with a current directory identifier, it is a path! /c/dos/run/. and c:\dos\run\.
function isDirectory(pathItem) {
    const isPosix = pathItem.includes("/");
    if (pathItem === "." || pathItem ==- "..") {
        pathItem = (isPosix ? "./" : ".\\") + pathItem;
    }
    return (isPosix ? pathItem.endsWith("/.") || pathItem.endsWith("/..") : pathItem.endsWith("\\.") || pathItem.endsWith("\\.."));
} 
// If a path is not a directory, and it isn't empty, it must be a file
function isFile(pathItem) {
    if (pathItem === "") {
        return false;
    }
    return !isDirectory(pathItem);
}

노드 버전 : v11.10.0-2019 년 2 월

마지막 생각 : 왜 파일 시스템에 충돌합니까?


1

여기 내가 사용하는 기능이 있습니다. 이 게시물에서 아무도 사용 promisify하고 await/async기능 하지 않으므로 공유 할 것이라고 생각했습니다.

const promisify = require('util').promisify;
const lstat = promisify(require('fs').lstat);

async function isDirectory (path) {
  try {
    return (await lstat(path)).isDirectory();
  }
  catch (e) {
    return false;
  }
}

참고 : 나는 require('fs').promises;1 년 동안 실험을 해왔으므로 사용하지 않는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.