programing

Node.js는 경로가 파일인지 디렉토리인지 확인합니다.

powerit 2023. 6. 12. 21:55
반응형

Node.js는 경로가 파일인지 디렉토리인지 확인합니다.

이 작업을 수행하는 방법을 설명하는 검색 결과를 얻을 수 없습니다.

내가 원하는 것은 주어진 경로가 파일인지 디렉토리(폴더)인지 알 수 있는 것입니다.

다음은 당신에게 말해줄 것입니다.문서에서:

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()

참고:

의 해결책은 다음과 같습니다.throw하나의Error, 약만; 들어를예,file또는directory존재하지 않습니다.

만약 당신이 원한다면,true또는false해 보세요, 접근, 도fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();아래 댓글에서 조셉이 언급한 것처럼.

업데이트: 노드.Js > = 10

우리는 새로운 fs.promise API를 사용할 수 있습니다.

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

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

모든 노드.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
   }
}

정말로, 질문은 5년 동안 존재하고 멋진 외관은 없습니까?

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

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

파일 시스템(예: 파일이 아직 생성되지 않은 경우)을 누를 수 없을 수도 있으며, 추가 검증이 필요하지 않은 경우에는 파일 시스템을 치지 않기를 원할 수도 있습니다.만약 당신이 확인하고 있는 것이 다음과 같다고 가정할 수 있다면,.<extname>형식입니다. 이름을 보십시오.

만약 당신이 ext 이름이 없는 파일을 찾고 있다면, 당신은 확실히 파일 시스템을 눌러야 할 것입니다.그러나 더 복잡한 작업이 필요할 때까지 단순하게 유지합니다.

const path = require('path');

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

디렉터리를 반복할 때 이 질문이 필요한 경우:

10 노드 10.10+ 이후 이후,fs.readdir에는 문자열 대신 디렉터리 항목을 반환하는 옵션이 있습니다.디렉터리 항목에 다음이 있습니다.name 속성 및과같유방용법과 .isDirectory또는isFile전화할 필요가 없습니다.fs.lstat노골적으로

import { promises as fs } from 'fs';

// ./my-dir has two subdirectories: dir-a, and dir-b

const dirEntries = await fs.readdir('./my-dir', { withFileTypes: true });

// let's filter all directories in ./my-dir

const onlyDirs = dirEntries.filter(de => de.isDirectory()).map(de => de.name);

// onlyDirs is now [ 'dir-a', 'dir-b' ]

여기 제가 사용하는 기능이 있습니다.도 아도사않다습니지무를 하지 않습니다.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년 동안 실험적이었기 때문입니다, 그것에 의존하지 않는 것이 좋습니다.

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

정답은 "/." (예: --> "/c/dos/run/" <--- trailing period)를 사용하여 디렉터리 기반 경로를 식별하는 것입니다.

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

// /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월

마지막 생각:왜 파일 시스템을 치는 거지?

다음을 사용하여 디렉터리 또는 파일이 있는지 확인할 수 있습니다.

// This returns if the file is not a directory.
if(fs.lstatSync(dir).isDirectory() == false) return;

// This returns if the folder is not a file.
if(fs.lstatSync(dir).isFile() == false) return;

형식을 반환하는 함수

나는 커피를 좋아한다.

type: (uri)-> (fina) ->
  fs.lstat uri, (erro,stats) ->
    console.log {erro} if erro
    fina(
      stats.isDirectory() and "directory" or
      stats.isFile() and "document" or
      stats.isSymbolicLink() and "link" or
      stats.isSocket() and "socket" or
      stats.isBlockDevice() and "block" or
      stats.isCharacterDevice() and "character" or
      stats.isFIFO() and "fifo"
    )

용도:

dozo.type("<path>") (type) ->
  console.log "type is #{type}"

언급URL : https://stackoverflow.com/questions/15630770/node-js-check-if-path-is-file-or-directory

반응형