web-dev-qa-db-ja.com

Node.jsはパスがファイルかディレクトリかをチェックします

その方法を説明する検索結果が得られないようです。

私がやりたいことは、与えられたパスがファイルなのかディレクトリ(フォルダ)なのかを知ることができることだけです。

320
ThomasReggi

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になります。例えば、filedirectoryは存在しません。 truthyまたはfalsyが必要な場合は、以下のコメントでJosephが述べているようにfs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();を試してください。

500
Jason Sperske

更新:Node.Js> = 10

新しい fs.promises APIを使用できます

実験的この機能はまだ活発に開発されており、将来のバージョンでは後方互換性のない変更、あるいは削除さえされる可能性があります。実稼働環境ではこの機能の使用はお勧めできません。実験的機能は、Node.jsのセマンティックバージョン管理モデルの影響を受けません。

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

(async() => {

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

任意のNode.Jsバージョン

これが、パスがファイルまたはディレクトリのどちらであるかを非同期で検出する方法です。これは、nodeで推奨される方法です。 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
   }
}
41

真剣に、質問は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;
    }
}
11
lama12345

あなたのニーズによっては、おそらくnodeのpathモジュールに頼ることができます。

あなたはファイルシステムをヒットすることができないかもしれません(例えば、ファイルはまだ作成されていません)そしてあなたが本当に余分な検証を必要としない限りあなたはおそらくファイルシステムにぶつかるのを避けたいです。あなたがチェックしているものが.<extname>フォーマットに従うという仮定をすることができるならば、ちょうど名前を見てください。

あなたがextnameなしでファイルを探しているなら明らかにあなたはファイルシステムをヒットする必要があるでしょう。しかし、もっと複雑になるまで単純にしてください。

const path = require('path');

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

上記の答えは、ファイルシステムにファイルまたはディレクトリのパスが含まれているかどうかを確認します。しかし、それは与えられたパスだけがファイルかディレクトリかを識別しません。

答えは、 "/"を使用してディレクトリベースのパスを識別することです。 like - > "/ 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
TamusJRoyce

これは私が私のプログラムのいくつかで使用する独立機能です。この記事でpromisifyawait/async機能を利用している人は誰もいないので、私は共有すると思いました。

const isDirectory = async path => {
  try {
    return (await require('util').promisify(require('fs').lstat)(path)).isDirectory()
  } catch (e) {
    return false // or custom the error
  }
}

注:require('fs').promises;は1年前から実験的なものなので使用しません。むしろそれに頼らないでください。

0
vdegenne