비어 있지 않은 디렉토리를 제거하십시오.


300

내 노드 응용 프로그램에서 일부 파일이있는 디렉토리를 제거해야하지만 fs.rmdir빈 디렉토리에서만 작동합니다. 어떻게해야합니까?


1
한마디로 : fs.readdir(dirPath)폴더의 경로 배열에 대해 반복하여 fs.unlink(filename)각 파일 fs.rmdir(dirPath)을 삭제 한 다음 마지막 으로 비어있는 폴더를 삭제합니다. 재발해야하는 경우 확인하십시오 fs.lstat(filename).isDirectory().
— iono

답변:


319

이를위한 모듈이 있습니다 rimraf( https://npmjs.org/package/rimraf ). 그것은 같은 기능을 제공합니다rm -Rf

비동기 사용법 :

var rimraf = require("rimraf");
rimraf("/some/directory", function () { console.log("done"); });

사용법 동기화 :

rimraf.sync("/some/directory");

1
이상한, 나는 그런 행동을 본 적이 없다. 버그를 검색하거나 신고하는 것이 좋습니다. github.com/isaacs/rimraf/issues
— Morgan ARR Allen

35
유지 관리되지 않는 타사 패키지를 설치하는 이유는 NodeJS Core 라이브러리로 쉽게 수행 할 수있는 것입니다.
— SudoKid 2016 년

4
@EmettSpeer 언제 "쉽게 수행"을 의미합니까? deleteFolderRecursive다음 답변 과 같은 기능을 자체 작성 합니까?
— Freewind

23
"하지만 기능이 더 우수하더라도 시스템에 불필요한 패키지를 추가하는 것이 좋습니다." 나는 매우 동의하지 않습니다. 전혀 이유없이 1 천 9 백만 번 바퀴를 재창조하고 있으며 프로세스에서 버그 나 보안 취약점이 발생할 위험이 있습니다. 최소한 시간 낭비입니다. Inb4 "패키지를 떨어 뜨린 경우": npm 레지스트리에서 패키지를 제거 할 가능성이 거의없는 경우 언제든지 자신의 패키지로 교체 할 수 있습니다 . 머리를 부수기 전에 붕대를 감을 필요는 없습니다.
— Demonblack

3
이제 recursive옵션을 사용할 수 있습니다 : stackoverflow.com/a/57866165/6269864

244

폴더를 동 기적으로 제거하려면

const fs = require('fs');
const Path = require('path');

const deleteFolderRecursive = function(path) {
  if (fs.existsSync(path)) {
    fs.readdirSync(path).forEach((file, index) => {
      const curPath = Path.join(path, file);
      if (fs.lstatSync(curPath).isDirectory()) { // recurse
        deleteFolderRecursive(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};

33
실수로 '/'에서 이것을 실행하지 않을 몇 가지 검사를 추가 할 수 있습니다. 예를 들어, 빈 경로와 파일의 오타가 전달되면 curPath가 루트 디렉토리가 될 수 있습니다.
— Jake_Howard

9
더 강력한 구현 : 대체 var curPath = path + "/" + file;와 함께 var curPath = p.join(path, file);제공 당신은 경로의 모듈을 포함 :var p = require("path")
— Andry

9
Windows에는 \ 슬래시가 있으므로 path.join(dirpath, file)path + "/" + file
— thybzi

5
한 번의 작동 시간으로 너무 많은 작업으로 인해이 코드에서 "최대 호출 스택 크기를 초과했습니다"라는 메시지가 표시 될 수 있습니다. @Walf 콘솔 응용 프로그램을 실행하면 더 많은 클라이언트가 아닌 하나의 클라이언트가 있습니다. 따라서이 경우 콘솔 앱에 비동기를 사용할 필요가 없습니다
— Leonid Dashko

4
'오류 : ENOTEMPTY : 디렉토리가 비어 있지 않습니다'
— Seagull

168

fsNode.js를 사용 하는 대부분의 사람들 은 파일을 다루는 "유닉스 방식"에 가까운 함수를 원합니다. fs-extra 를 사용하여 모든 멋진 물건을 가져 왔습니다.

fs-extra는 vanilla Node.js fs 패키지에 포함되지 않은 메소드를 포함합니다. mkdir -p, cp -r 및 rm -rf와 같은.

더 좋은 점은 fs-extra 가 기본 fs를 대체하는 것입니다. fs의 모든 메소드는 수정되지 않고 첨부됩니다. fs를 fs-extra로 대체 할 수 있음을 의미합니다 .

// this can be replaced
const fs = require('fs')

// by this
const fs = require('fs-extra')

그런 다음 폴더를 다음과 같이 제거 할 수 있습니다.

fs.removeSync('/tmp/myFolder'); 
//or
fs.remove('/tmp/myFolder', callback);

동기화 버전의 경우removeSync('/tmp/myFolder')
— olidem

148

2019 년 기준 ...

현재 Node.js를 12.10.0 , fs.rmdirSync지원 recursive당신이 마지막으로 할 수 있도록 옵션 :

fs.rmdirSync(dir, { recursive: true });

이 recursive옵션은 전체 디렉토리를 재귀 적으로 삭제합니다.


5
@anneb 이전 버전의 Node.js (<12.10)를 사용하는 경우에 발생합니다. 최신 버전은 옵션을 인식하고 recursive: true불만없이 비어 있지 않은 폴더를 삭제합니다.
— GOTO 0

9
재귀 제거는 여전히 노드 v13.0.1부터 실험 중입니다.
— Tim

5
함수 서명은 실제로 fs.rmdir(path[, options], callback)또는fs.rmdirSync(path[, options])
— conceptdeluxe

@Tim 실험이란 무엇입니까?
— Emerica

2
@Emerica 공식 node.js 문서 에는 fs.rmdir안정성이 실험적 이라는 큰 주황색 알림 이 있습니다. "안정성 : 1-실험적입니다.이 기능은 시맨틱 버전 관리 규칙이 적용되지 않습니다. 이전 버전과 호환되지 않는 변경 또는 제거는 어떤 경우에도 발생할 수 있습니다. 이 기능은 프로덕션 환경에서 사용하지 않는 것이 좋습니다. "
— 팀

24

@oconnecp ( https : //.com/a/25069828/3027390 ) 에서 수정 된 답변

크로스 플랫폼 환경을 개선하기 위해 path.join을 사용합니다. 그러므로 꼭 요구하십시오.

var path = require('path');

또한 함수의 이름을 rimraf;)으로 바꿨습니다 .

/**
 * Remove directory recursively
 * @param {string} dir_path
 * @see https://stackoverflow.com/a/42505874/3027390
 */
function rimraf(dir_path) {
    if (fs.existsSync(dir_path)) {
        fs.readdirSync(dir_path).forEach(function(entry) {
            var entry_path = path.join(dir_path, entry);
            if (fs.lstatSync(entry_path).isDirectory()) {
                rimraf(entry_path);
            } else {
                fs.unlinkSync(entry_path);
            }
        });
        fs.rmdirSync(dir_path);
    }
}

17

나는 보통 오래된 실을 부활시키지 않지만 여기에 많은 이탈이 있으며 rimraf 대답은 이것들 모두에게 지나치게 복잡해 보입니다.

현대 노드 (> = v8.0.0)에서 첫 번째로 노드 코어 모듈 만 사용하여 프로세스를 단순화하고 완전히 비 동기화하며 파일의 링크를 동시에 5 줄의 함수로 동시에 병렬화하고 가독성을 유지할 수 있습니다.

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const readdir = promisify(fs.readdir);
const rmdir = promisify(fs.rmdir);
const unlink = promisify(fs.unlink);

exports.rmdirs = async function rmdirs(dir) {
  let entries = await readdir(dir, { withFileTypes: true });
  await Promise.all(entries.map(entry => {
    let fullPath = path.join(dir, entry.name);
    return entry.isDirectory() ? rmdirs(fullPath) : unlink(fullPath);
  }));
  await rmdir(dir);
};

또 다른 참고로, 경로 순회 공격에 대한 보호 는이 기능에 적합하지 않기 때문에

  1. 단일 책임 원칙 (Single Responsibility Principle) 에 따라 범위를 벗어납니다 .
  2. 이 함수가 아닌 호출자가 처리해야합니다 . 이것은 명령 행과 유사 rm -rf하며 인수를 취하고 사용자가 rm -rf /요청하면 이를 허용합니다 . rm프로그램 자체 를 보호하지 않는 것은 스크립트의 책임입니다 .
  3. 이 기능은 참조 프레임이 없기 때문에 이러한 공격을 확인할 수 없습니다. 또한 경로 통과를 비교하기위한 참조를 제공 할 의도의 컨텍스트를 갖는 호출자의 책임입니다.
  4. sym-links .isDirectory()는 falsesym-links와 마찬가지로 걱정 되지 않으며 되풀이되지 않습니다.

마지막 으로,이 재귀가 실행되는 동안 적절한 시점에 항목 중 하나 가이 스크립트 외부 에서 연결 해제되거나 삭제 된 경우 재귀 오류가 발생할 수있는 드문 경쟁 조건 이 있습니다. 이 시나리오는 대부분의 환경에서 일반적이지 않으므로 간과 될 수 있습니다. 그러나 필요한 경우 (일부 사례의 경우) 다음과 같이 좀 더 복잡한 예제를 통해이 문제를 완화 할 수 있습니다.

exports.rmdirs = async function rmdirs(dir) {
  let entries = await readdir(dir, { withFileTypes: true });
  let results = await Promise.all(entries.map(entry => {
    let fullPath = path.join(dir, entry.name);
    let task = entry.isDirectory() ? rmdirs(fullPath) : unlink(fullPath);
    return task.catch(error => ({ error }));
  }));
  results.forEach(result => {
    // Ignore missing files/directories; bail on other errors
    if (result && result.error.code !== 'ENOENT') throw result.error;
  });
  await rmdir(dir);
};

편집 :isDirectory() 기능을 만듭니다 . 마지막에 실제 디렉토리를 제거하십시오. 누락 된 재귀를 수정하십시오.


1
이것은 정말 깔끔한 솔루션입니다. 두 번째 코드 샘플에 관한 질문 : 전화를하지 않습니다 await에 대한 귀하의 Promise.all(…); 이것은 의도적 인 것입니까? 현재 상태 results.forEach에서 약속을 반복하는 것처럼 보이고 코드는 결과를 반복 할 것으로 예상합니다. 뭔가 빠졌습니까?
— Anton Strogonoff

@Tony 당신은 맞습니다 오타 / 버그입니다. 잘 잡아!
— Sukima

디렉토리가 존재하는지 먼저 확인하십시오. 뭔가 같은if (!fs.existsSync(dir)) return
— GTPV

@GTPV 왜? 이것은이 기능의 책임을 증가시킵니다. readdir예상대로 오류가 발생합니다. 당신이 경우 rmdir non-existing-dir종료 코드는 오류입니다. 시도 / 잡기를하는 것은 소비자의 책임입니다. 이것은 fs 함수를 사용할 때 노드 문서에 설명 된 것과 동일한 방법입니다. 그들은 당신이 시도 / 캐치를 시도하고 오류 code를보고 어떻게 해야할지 결정합니다. 추가 검사는 경쟁 조건을 나타냅니다.
— Sukima

분명히 요점을 봅니다. 존재하지 않는 폴더를 삭제하려고하면 직관적으로 아무것도하지 않기 때문에 직관적으로 기대할 수 있습니다. 동기 버전 fs.exists이 사용되는 경우 경쟁 조건이 없습니다 . 추신 : 이것은 훌륭한 솔루션입니다.
— GTPV

12

@SharpCoder의 비동기 버전은 다음과 같습니다.

const fs = require('fs');
const path = require('path');

function deleteFile(dir, file) {
    return new Promise(function (resolve, reject) {
        var filePath = path.join(dir, file);
        fs.lstat(filePath, function (err, stats) {
            if (err) {
                return reject(err);
            }
            if (stats.isDirectory()) {
                resolve(deleteDirectory(filePath));
            } else {
                fs.unlink(filePath, function (err) {
                    if (err) {
                        return reject(err);
                    }
                    resolve();
                });
            }
        });
    });
};

function deleteDirectory(dir) {
    return new Promise(function (resolve, reject) {
        fs.access(dir, function (err) {
            if (err) {
                return reject(err);
            }
            fs.readdir(dir, function (err, files) {
                if (err) {
                    return reject(err);
                }
                Promise.all(files.map(function (file) {
                    return deleteFile(dir, file);
                })).then(function () {
                    fs.rmdir(dir, function (err) {
                        if (err) {
                            return reject(err);
                        }
                        resolve();
                    });
                }).catch(reject);
            });
        });
    });
};

10

폴더 제거라는이 기능을 작성했습니다. 한 위치에있는 모든 파일과 폴더를 재귀 적으로 제거합니다. 필요한 유일한 패키지는 비동기입니다.

var async = require('async');

function removeFolder(location, next) {
    fs.readdir(location, function (err, files) {
        async.each(files, function (file, cb) {
            file = location + '/' + file
            fs.stat(file, function (err, stat) {
                if (err) {
                    return cb(err);
                }
                if (stat.isDirectory()) {
                    removeFolder(file, cb);
                } else {
                    fs.unlink(file, function (err) {
                        if (err) {
                            return cb(err);
                        }
                        return cb();
                    })
                }
            })
        }, function (err) {
            if (err) return next(err)
            fs.rmdir(location, function (err) {
                return next(err)
            })
        })
    })
}

4
아이디어는 실제로 다른 사람이 이미 작성한 경우 자신의 코드를 작성하지 않는 것입니다. 더 좋은 방법은 rimraf 또는 fs-extra 또는 다른 노드 모듈을 사용하여 작업을 수행하는 것입니다.
— Victor Pudeyev

90
예, 비교적 사소한 작업에 수십 개의 타사 모듈을 사용하면 대규모 응용 프로그램에서 단점이없는 것으로 입증 되었기 때문에 자신의 코드를 작성하는 것은 끔찍합니다.
— Eric

8

노드 8 이상을 사용하고 비동기 성을 원하고 외부 종속성을 원하지 않는 경우 async / await 버전은 다음과 같습니다.

const path = require('path');
const fs = require('fs');
const util = require('util');

const readdir = util.promisify(fs.readdir);
const lstat = util.promisify(fs.lstat);
const unlink = util.promisify(fs.unlink);
const rmdir = util.promisify(fs.rmdir);

const removeDir = async (dir) => {
    try {
        const files = await readdir(dir);
        await Promise.all(files.map(async (file) => {
            try {
                const p = path.join(dir, file);
                const stat = await lstat(p);
                if (stat.isDirectory()) {
                    await removeDir(p);
                } else {
                    await unlink(p);
                    console.log(`Removed file ${p}`);
                }
            } catch (err) {
                console.error(err);
            }
        }))
        await rmdir(dir);
        console.log(`Removed dir ${dir}`);
    } catch (err) {
      console.error(err);
    }
}

4

fs.promises를 사용한 @SharpCoder 의 비동기 버전 :

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

const deleteFolderRecursive = async path =>  {
    if (fs.existsSync(path)) {
        for (let entry of await afs.readdir(path)) {
            const curPath = path + "/" + entry;
            if ((await afs.lstat(curPath)).isDirectory())
                await deleteFolderRecursive(curPath);
            else await afs.unlink(curPath);
        }
        await afs.rmdir(path);
    }
};

3

나는 극복하려고 노력하면서 여기에 도달했으며 gulp더 많은 도달을 위해 글을 쓰고 있습니다.

을 사용하여 파일과 폴더를 삭제하려면 재귀 삭제를 del추가해야합니다 /**.

gulp.task('clean', function () {
    return del(['some/path/to/delete/**']);
});

2

사실상의 패키지는 rimraf이지만 여기에 작은 비동기 버전이 있습니다.

const fs = require('fs')
const path = require('path')
const Q = require('q')

function rmdir (dir) {
  return Q.nfcall(fs.access, dir, fs.constants.W_OK)
    .then(() => {
      return Q.nfcall(fs.readdir, dir)
        .then(files => files.reduce((pre, f) => pre.then(() => {
          var sub = path.join(dir, f)
          return Q.nfcall(fs.lstat, sub).then(stat => {
            if (stat.isDirectory()) return rmdir(sub)
            return Q.nfcall(fs.unlink, sub)
          })
        }), Q()))
    })
    .then(() => Q.nfcall(fs.rmdir, dir))
}


2

fsdocumentation 에 따르면 , fsPromises현재 recursive실험적인 옵션을 제공합니다 . 최소한의 경우 Windows의 경우 디렉토리와 그 안의 파일을 제거합니다.

fsPromises.rmdir(path, {
  recursive: true
})

recursive: trueLinux 및 MacOS에서 파일을 제거 합니까 ?


1

초고속 및 고장 방지

lignator패키지 ( https://www.npmjs.com/package/lignator )를 사용할 수 있으며 비동기 코드 (예 : rimraf)보다 빠르며 고장 방지 (특히 Windows에서 파일 제거가 즉각적이지 않고 파일이있을 수 있음) 다른 프로세스에 의해 잠김).

Windows의 경우 4,36GB의 데이터, 28,042 개의 파일, 4 개의 217 개의 폴더가 15 초 만에 제거되었습니다 .

const lignator = require('lignator');

lignator.remove('./build/');

1

동기화 폴더는 파일 또는 파일로만 제거하십시오.

난 안 많이주는 사람이나 기여자의 모르지만, 나는이 문제의 좋은 해결책을 찾을 수 없습니다 나는 당신이 그것을 :) 좋아 바랍니다 그래서 나는 ... 내 길을 찾아야했다

임의의 수와 나를 위해 작동 완벽 중첩 된 디렉토리 및 하위 디렉토리 함수를 되풀이 할 때 'this'의 범위에 대한주의는 구현이 다를 수 있습니다. 필자의 경우이 함수는 다른 함수의 반환 상태를 유지 하므로이 함수를 호출합니다.

    const fs = require('fs');

    deleteFileOrDir(path, pathTemp = false){
            if (fs.existsSync(path)) {
                if (fs.lstatSync(path).isDirectory()) {
                    var files = fs.readdirSync(path);
                    if (!files.length) return fs.rmdirSync(path);
                    for (var file in files) {
                        var currentPath = path + "/" + files[file];
                        if (!fs.existsSync(currentPath)) continue;
                        if (fs.lstatSync(currentPath).isFile()) {
                            fs.unlinkSync(currentPath);
                            continue;
                        }
                        if (fs.lstatSync(currentPath).isDirectory() && !fs.readdirSync(currentPath).length) {
                            fs.rmdirSync(currentPath);
                        } else {
                            this.deleteFileOrDir(currentPath, path);
                        }
                    }
                    this.deleteFileOrDir(path);
                } else {
                    fs.unlinkSync(path);
                }
            }
            if (pathTemp) this.deleteFileOrDir(pathTemp);
        }

1

recursive실험 옵션 이지만fs.rmdir

function rm (path, cb) {
    fs.stat(path, function (err, stats) {
        if (err)
            return cb(err);

        if (stats.isFile())
            return fs.unlink(path, cb);

        fs.rmdir(path, function (err) {
            if (!err || err && err.code != 'ENOTEMPTY') 
                return cb(err);

            fs.readdir(path, function (err, files) {
                if (err)
                    return cb(err);

                let next = i => i == files.length ? 
                    rm(path, cb) : 
                    rm(path + '/' + files[i], err => err ? cb(err) : next(i + 1));

                next(0);
            });
        });
    });
}

1

2020 업데이트

버전 12.10.0부터 recursiveOption 이 옵션에 추가되었습니다.

참고 재귀 삭제가 실험이다 .

그래서 당신은 동기화를 위해 할 것입니다 :

fs.rmdirSync(dir, {recursive: true});

또는 비동기의 경우 :

fs.rmdir(dir, {recursive: true});

0

rmdir 모듈을 사용하십시오 ! 쉽고 간단합니다.


6
작은 코드마다 모듈을 사용하는 것이 항상 좋은 생각은 아닙니다. 예를 들어 사용권 계약을 작성해야하는 경우에는 실제 문제가 발생합니다.
— Mijago

4
보다 흥미로운 답변을
— 얻으

0

또 다른 대안은 사용 fs-promise의 promisified 버전 제공 모듈 fs-extra모듈

그런 다음이 예제와 같이 쓸 수 있습니다.

const { remove, mkdirp, writeFile, readFile } = require('fs-promise')
const { join, dirname } = require('path')

async function createAndRemove() {
  const content = 'Hello World!'
  const root = join(__dirname, 'foo')
  const file = join(root, 'bar', 'baz', 'hello.txt')

  await mkdirp(dirname(file))
  await writeFile(file, content)
  console.log(await readFile(file, 'utf-8'))
  await remove(join(__dirname, 'foo'))
}

createAndRemove().catch(console.error)

참고 : async / await에는 최신 nodejs 버전 (7.6 이상)이 필요합니다


0

빠르고 테스트 방법 은 테스트 를 위해 직접 exec또는 spawn메소드를 사용 하여 디렉토리를 제거하기 위해 OS 호출을 호출하는 것입니다. NodeJs child_process 에 대해 자세히 알아보십시오 .

let exec = require('child_process').exec
exec('rm -Rf /tmp/*.zip', callback)

단점은 다음과 같습니다.

  1. 기본 OS에 의존하고 있습니다. 즉, 동일한 방법이 unix / linux에서 실행되지만 아마도 Windows에서는 실행되지 않습니다.
  2. 조건이나 오류로 프로세스를 가로 챌 수 없습니다. 태스크를 기본 OS에 제공하고 종료 코드가 리턴 될 때까지 기다리십시오.

혜택:

  1. 이러한 프로세스는 비동기 적으로 실행될 수 있습니다.
  2. 명령의 출력 / 오류를들을 수 있으므로 명령 출력이 손실되지 않습니다. 작업이 완료되지 않으면 오류 코드를 확인하고 다시 시도 할 수 있습니다.

2
스크립트를 작성하고 모든 파일을 삭제 한 후 30 초 안에이 스크립트를 삭제하려고하므로 종속성을 설치하지 않으려는 경우에 적합합니다 !!
— Mathias

항상 루트 파일 시스템을 엉망으로 만드는 방법이 있습니다. 이 경우 OP는 -f안전을 위해 플래그를 제거 하거나 입력하는 동안 모든 항목을 삭제하지 않도록 할 수 있습니다. exec + rm테스트 중에 자주 사용하는 노드에서 유효하고 유용한 명령입니다.
— 발진

0

나는 아주 소소하고 일반적인 것을 위해 추가 모듈없이 이것을 할 수있는 방법이 있었으면 좋겠다. 그러나 이것이 내가 생각해 낼 수있는 최선이다.

업데이트 : 이제 Windows (테스트 된 Windows 10)에서 작동하고 Linux / Unix / BSD / Mac 시스템에서도 작동합니다.

const
    execSync = require("child_process").execSync,
    fs = require("fs"),
    os = require("os");

let removeDirCmd, theDir;

removeDirCmd = os.platform() === 'win32' ? "rmdir /s /q " : "rm -rf ";

theDir = __dirname + "/../web-ui/css/";

// WARNING: Do not specify a single file as the windows rmdir command will error.
if (fs.existsSync(theDir)) {
    console.log(' removing the ' + theDir + ' directory.');
    execSync(removeDirCmd + '"' + theDir + '"', function (err) {
        console.log(err);
    });
}

어쩌면 fs-extra 's가 단일 모듈을 원한다면 갈 길입니다.
— b01

3
이 방법은 매우 위험합니다. 쉘 명령의 문자열 연결 (특히 이스케이프 없음)은 코드 실행 취약성을 유발합니다. rmdir을 사용 child_process.execFile하려면 쉘을 호출하지 않는 인수를 사용하고 대신 명시 적으로 인수를 전달하십시오.
— nevyn

@nevyn 나는 그것을 시도하고 그것이 작동한다면 대답을 업데이트 할 것입니다.
— b01

항상 타사를 사용하지 않는 것이 좋습니다! 감사!
— Anton Mitsev

또한이 방법은 매우 느립니다. Nodejs 네이티브 API가 훨씬 빠릅니다.
— mersey

0

이것은 약속을 해결하기 위해 약속과 두 가지 도움말 기능을 사용하는 하나의 접근 방식입니다.

모든 작업을 비동기 적으로 수행합니다.

const fs = require('fs');
const { promisify } = require('util');
const to = require('./to');
const toAll = require('./toAll');

const readDirAsync = promisify(fs.readdir);
const rmDirAsync = promisify(fs.rmdir);
const unlinkAsync = promisify(fs.unlink);

/**
    * @author Aécio Levy
    * @function removeDirWithFiles
    * @usage: remove dir with files
    * @param {String} path
    */
const removeDirWithFiles = async path => {
    try {
        const file = readDirAsync(path);
        const [error, files] = await to(file);
        if (error) {
            throw new Error(error)
        }
        const arrayUnlink = files.map((fileName) => {
            return unlinkAsync(`${path}/${fileName}`);
        });
        const [errorUnlink, filesUnlink] = await toAll(arrayUnlink);
        if (errorUnlink) {
            throw new Error(errorUnlink);
        }
        const deleteDir = rmDirAsync(path);
        const [errorDelete, result] = await to(deleteDir);
        if (errorDelete) {
            throw new Error(errorDelete);
        }
    } catch (err) {
        console.log(err)
    }
}; 

0

// 타사 lib를 사용하지 않고

const fs = require('fs');
var FOLDER_PATH = "./dirname";
var files = fs.readdirSync(FOLDER_PATH);
files.forEach(element => {
    fs.unlinkSync(FOLDER_PATH + "/" + element);
});
fs.rmdirSync(FOLDER_PATH);

1
이것은 내가 필요한 것에 효과가 있지만 슬래시를 연결하는 대신 경로를 사용하고 싶을 수도 있습니다.fs.unllinkSync(path.join(FOLDER_PATH, element);
— jackofallcode

-1
const fs = require("fs")
const path = require("path")

let _dirloc = '<path_do_the_directory>'

if (fs.existsSync(_dirloc)) {
  fs.readdir(path, (err, files) => {
    if (!err) {
      for (let file of files) {
        // Delete each file
        fs.unlinkSync(path.join(_dirloc, file))
      }
    }
  })
  // After the 'done' of each file delete,
  // Delete the directory itself.
  if (fs.unlinkSync(_dirloc)) {
    console.log('Directory has been deleted!')
  }
}

1
중첩 디렉토리에서 이와 같은 것이 작동해야한다고 생각합니다.
— fool4jesus

예, 모두 중첩 된 디렉토리와 비 중첩 된 하나
— Erisan Olasheni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.