mirror of
https://github.com/denoland/deno.git
synced 2024-12-28 10:09:20 -05:00
feat: add emptyDir for fs modules (denoland/deno_std#263)
Original: 64d6bfca56
This commit is contained in:
parent
ef6d932358
commit
d4ba2978a6
3 changed files with 170 additions and 0 deletions
52
fs/empty_dir.ts
Normal file
52
fs/empty_dir.ts
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
/**
|
||||||
|
* Ensures that a directory is empty.
|
||||||
|
* Deletes directory contents if the directory is not empty.
|
||||||
|
* If the directory does not exist, it is created.
|
||||||
|
* The directory itself is not deleted.
|
||||||
|
* @export
|
||||||
|
* @param {string} dir
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
export async function emptyDir(dir: string): Promise<void> {
|
||||||
|
let items: Deno.FileInfo[] = [];
|
||||||
|
try {
|
||||||
|
items = await Deno.readDir(dir);
|
||||||
|
} catch {
|
||||||
|
// if not exist. then create it
|
||||||
|
await Deno.mkdir(dir, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (items.length) {
|
||||||
|
const item = items.shift();
|
||||||
|
if (item && item.path) {
|
||||||
|
await Deno.remove(item.path, { recursive: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that a directory is empty.
|
||||||
|
* Deletes directory contents if the directory is not empty.
|
||||||
|
* If the directory does not exist, it is created.
|
||||||
|
* The directory itself is not deleted.
|
||||||
|
* @export
|
||||||
|
* @param {string} dir
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
export function emptyDirSync(dir: string): void {
|
||||||
|
let items: Deno.FileInfo[] = [];
|
||||||
|
try {
|
||||||
|
items = Deno.readDirSync(dir);
|
||||||
|
} catch {
|
||||||
|
// if not exist. then create it
|
||||||
|
Deno.mkdirSync(dir, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (items.length) {
|
||||||
|
const item = items.shift();
|
||||||
|
if (item && item.path) {
|
||||||
|
Deno.removeSync(item.path, { recursive: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
117
fs/empty_dir_test.ts
Normal file
117
fs/empty_dir_test.ts
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
import { test } from "../testing/mod.ts";
|
||||||
|
import { assertEquals, assertThrowsAsync } from "../testing/asserts.ts";
|
||||||
|
import { emptyDir, emptyDirSync } from "./empty_dir.ts";
|
||||||
|
import * as path from "./path/mod.ts";
|
||||||
|
|
||||||
|
const testdataDir = path.resolve("fs", "testdata");
|
||||||
|
|
||||||
|
test(async function emptyDirIfItNotExist() {
|
||||||
|
const testDir = path.join(testdataDir, "empty_dir_test_1");
|
||||||
|
const testNestDir = path.join(testDir, "nest");
|
||||||
|
// empty a dir which not exist. then it will create new one
|
||||||
|
await emptyDir(testNestDir);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// check the dir
|
||||||
|
const stat = await Deno.stat(testNestDir);
|
||||||
|
assertEquals(stat.isDirectory(), true);
|
||||||
|
} finally {
|
||||||
|
// remove the test dir
|
||||||
|
Deno.remove(testDir, { recursive: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test(function emptyDirSyncIfItNotExist() {
|
||||||
|
const testDir = path.join(testdataDir, "empty_dir_test_2");
|
||||||
|
const testNestDir = path.join(testDir, "nest");
|
||||||
|
// empty a dir which not exist. then it will create new one
|
||||||
|
emptyDirSync(testNestDir);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// check the dir
|
||||||
|
const stat = Deno.statSync(testNestDir);
|
||||||
|
assertEquals(stat.isDirectory(), true);
|
||||||
|
} finally {
|
||||||
|
// remove the test dir
|
||||||
|
Deno.remove(testDir, { recursive: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test(async function emptyDirIfItExist() {
|
||||||
|
const testDir = path.join(testdataDir, "empty_dir_test_3");
|
||||||
|
const testNestDir = path.join(testDir, "nest");
|
||||||
|
// create test dir
|
||||||
|
await emptyDir(testNestDir);
|
||||||
|
const testDirFile = path.join(testNestDir, "test.ts");
|
||||||
|
// create test file in test dir
|
||||||
|
await Deno.writeFile(testDirFile, new Uint8Array());
|
||||||
|
|
||||||
|
// before empty: make sure file/directory exist
|
||||||
|
const beforeFileStat = await Deno.stat(testDirFile);
|
||||||
|
assertEquals(beforeFileStat.isFile(), true);
|
||||||
|
|
||||||
|
const beforeDirStat = await Deno.stat(testNestDir);
|
||||||
|
assertEquals(beforeDirStat.isDirectory(), true);
|
||||||
|
|
||||||
|
await emptyDir(testDir);
|
||||||
|
|
||||||
|
// after empty: file/directory have already remove
|
||||||
|
try {
|
||||||
|
// test dir still there
|
||||||
|
const stat = await Deno.stat(testDir);
|
||||||
|
assertEquals(stat.isDirectory(), true);
|
||||||
|
|
||||||
|
// nest directory have been remove
|
||||||
|
assertThrowsAsync(async () => {
|
||||||
|
await Deno.stat(testNestDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
// test file have been remove
|
||||||
|
assertThrowsAsync(async () => {
|
||||||
|
await Deno.stat(testDirFile);
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
// remote test dir
|
||||||
|
await Deno.remove(testDir, { recursive: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test(function emptyDirSyncIfItExist() {
|
||||||
|
const testDir = path.join(testdataDir, "empty_dir_test_4");
|
||||||
|
const testNestDir = path.join(testDir, "nest");
|
||||||
|
// create test dir
|
||||||
|
emptyDirSync(testNestDir);
|
||||||
|
const testDirFile = path.join(testNestDir, "test.ts");
|
||||||
|
// create test file in test dir
|
||||||
|
Deno.writeFileSync(testDirFile, new Uint8Array());
|
||||||
|
|
||||||
|
// before empty: make sure file/directory exist
|
||||||
|
const beforeFileStat = Deno.statSync(testDirFile);
|
||||||
|
assertEquals(beforeFileStat.isFile(), true);
|
||||||
|
|
||||||
|
const beforeDirStat = Deno.statSync(testNestDir);
|
||||||
|
assertEquals(beforeDirStat.isDirectory(), true);
|
||||||
|
|
||||||
|
emptyDirSync(testDir);
|
||||||
|
|
||||||
|
// after empty: file/directory have already remove
|
||||||
|
try {
|
||||||
|
// test dir still there
|
||||||
|
const stat = Deno.statSync(testDir);
|
||||||
|
assertEquals(stat.isDirectory(), true);
|
||||||
|
|
||||||
|
// nest directory have been remove
|
||||||
|
assertThrowsAsync(async () => {
|
||||||
|
Deno.statSync(testNestDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
// test file have been remove
|
||||||
|
assertThrowsAsync(async () => {
|
||||||
|
Deno.statSync(testDirFile);
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
// remote test dir
|
||||||
|
Deno.removeSync(testDir, { recursive: true });
|
||||||
|
}
|
||||||
|
});
|
1
test.ts
1
test.ts
|
@ -15,6 +15,7 @@ import "./fs/walk_test.ts";
|
||||||
import "./fs/globrex_test.ts";
|
import "./fs/globrex_test.ts";
|
||||||
import "./fs/glob_test.ts";
|
import "./fs/glob_test.ts";
|
||||||
import "./fs/exists_test.ts";
|
import "./fs/exists_test.ts";
|
||||||
|
import "./fs/empty_dir_test.ts";
|
||||||
import "./io/test.ts";
|
import "./io/test.ts";
|
||||||
import "./http/server_test.ts";
|
import "./http/server_test.ts";
|
||||||
import "./http/file_server_test.ts";
|
import "./http/file_server_test.ts";
|
||||||
|
|
Loading…
Reference in a new issue