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

注意:

溶液上の意志であれば、EXのために、またはが存在していません。throwErrorfiledirectory

trueまたはfalseアプローチが必要な場合は、fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();以下のコメントでジョセフが述べたように試してください。


18
アプリの一般的なパフォーマンスを気にする場合は、通常、非同期バージョンが望ましいことに注意してください。
AlexMA 2014年

45
ディレクトリまたはファイルが存在しない場合は、エラーが返されることに注意してください。
Ethan Mick

9
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
ジョセフハルシュ

ファイルまたはディレクトリが存在しない場合は、キャッチする必要のある例外をスローすることに注意してください。
セルゲイクズネツォフ

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.