1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-29 02:29:06 -05:00

feat: add emptyDir for fs modules (denoland/deno_std#263)

Original: 64d6bfca56
This commit is contained in:
Axetroy 2019-03-12 02:19:52 +08:00 committed by Ryan Dahl
parent ef6d932358
commit d4ba2978a6
3 changed files with 170 additions and 0 deletions

52
fs/empty_dir.ts Normal file
View 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
View 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 });
}
});

View file

@ -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";