Skip to content

Commit cea5d9a

Browse files
committed
moving files and directories.
1 parent ad360bd commit cea5d9a

File tree

7 files changed

+147
-3
lines changed

7 files changed

+147
-3
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
node_modules/
2+
3+
.vscodeignore
4+
5+
*.vsix

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77
* __DELETE FILE__
88
* __DELETE DIRECTORY__
99
* __RENAME FILE__
10-
* __RENAME DIRECTORY__
10+
* __RENAME DIRECTORY__
11+
* __MOVING FILE__
12+
* __MOVING DIRECTORY__

constants/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ const TERMINAL = {
1616
darwin: 'rm',
1717
linux: 'rm',
1818
win32: 'del'
19+
},
20+
move: {
21+
darwin: 'mv',
22+
linux: 'mv',
23+
win32: 'move'
1924
}
2025
};
2126
Object.freeze(TERMINAL);
@@ -24,6 +29,10 @@ const ACTIONS_MSG = {
2429
delete: {
2530
confirm: 'Confirm',
2631
cancel: 'Cancel'
32+
},
33+
moveType: {
34+
folder: "folder",
35+
file: "file"
2736
}
2837
}
2938
Object.freeze(ACTIONS_MSG);

extension.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const deleteDirectoryRegisterFunction = require('./registerFunctions/deleteDirec
77
const deleteFileRegisterFunction = require('./registerFunctions/deleteFile');
88
const renameFileRegisterFunction = require('./registerFunctions/renameFile');
99
const renameDirectoryRegisterFunction = require('./registerFunctions/renameDirectory');
10+
const moveFileOrDirectory = require("./utils/moveFileOrDirectory");
1011

1112
/**
1213
* @param {vscode.ExtensionContext} context
@@ -44,12 +45,44 @@ async function activate(context) {
4445
renameDirectoryRegisterFunction
4546
)
4647

48+
let moveFileDisposable = vscode.commands.registerCommand(
49+
"file.moveFile",
50+
async function() {
51+
try {
52+
if (vscode.workspace.workspaceFolders === undefined)
53+
return;
54+
55+
await moveFileOrDirectory('file');
56+
}
57+
catch (err) {
58+
vscode.window.showErrorMessage(err.message);
59+
}
60+
}
61+
)
62+
63+
let moveDirectoryDisposable = vscode.commands.registerCommand(
64+
"file.moveDirectory",
65+
async function() {
66+
try {
67+
if (vscode.workspace.workspaceFolders === undefined)
68+
return;
69+
70+
await moveFileOrDirectory('folder');
71+
}
72+
catch (err) {
73+
vscode.window.showErrorMessage(err.message);
74+
}
75+
}
76+
)
77+
4778
context.subscriptions.push(createNewFileDisposable);
4879
context.subscriptions.push(createNewDirectoryDisposable);
4980
context.subscriptions.push(deleteDirectoryDisposable);
5081
context.subscriptions.push(deleteFileDisposable);
5182
context.subscriptions.push(renameFileDisposable);
5283
context.subscriptions.push(renameDirectoryDisposable);
84+
context.subscriptions.push(moveFileDisposable);
85+
context.subscriptions.push(moveDirectoryDisposable);
5386
}
5487

5588
function deactivate() {}

package.json

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "file-manager",
33
"displayName": "file-manager",
44
"description": "",
5-
"version": "1.0.1",
5+
"version": "1.1.2",
66
"engines": {
77
"vscode": "^1.60.0"
88
},
@@ -32,7 +32,9 @@
3232
"onCommand:file.deleteDirectory",
3333
"onCommand:file.deleteFile",
3434
"onCommand:file.renameFile",
35-
"onCommand:file.renameDirectory"
35+
"onCommand:file.renameDirectory",
36+
"onCommand:file.moveFile",
37+
"onCommand:file.moveDirectory"
3638
],
3739
"main": "./extension.js",
3840
"contributes": {
@@ -60,6 +62,14 @@
6062
{
6163
"command": "file.renameDirectory",
6264
"title": "Rename Directory"
65+
},
66+
{
67+
"command": "file.moveDirectory",
68+
"title": "Move Directory"
69+
},
70+
{
71+
"command": "file.moveFile",
72+
"title": "Move File"
6373
}
6474
]
6575
},

utils/executeCommand.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
const { exec }= require('child_process');
22

3+
/**
4+
*
5+
* @param {string} command cannot be null or undefined
6+
* @returns Promise<string>
7+
*/
38
async function executeCommand(command) {
49
return new Promise((resolve, reject) => {
10+
if (command === undefined || command === null)
11+
return reject('Command provided cannot be null or undefined');
512
exec(command, (err, stdout, stderr) => {
613
if (err) return reject(stderr);
714
else resolve(stdout);

utils/moveFileOrDirectory.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
const vscode = require("vscode");
2+
const { ACTIONS_MSG, TERMINAL } = require("../constants");
3+
const executeCommand = require("./executeCommand");
4+
const getCurrentDirectoryFiles = require("./getFiles");
5+
const getCurrentDirectoryFolders = require("./getFolders");
6+
7+
/**
8+
*
9+
* @param {string} type default value is folder
10+
* @returns nothing
11+
*/
12+
async function moveFileOrDirectory(type = ACTIONS_MSG.moveType.folder) {
13+
try {
14+
if (vscode.workspace.workspaceFolders === undefined)
15+
return;
16+
17+
if (type === undefined || type === null)
18+
type = ACTIONS_MSG.moveType.folder;
19+
20+
if (
21+
type !== ACTIONS_MSG.moveType.file &&
22+
type !== ACTIONS_MSG.moveType.folder
23+
)
24+
type = ACTIONS_MSG.moveType.folder;
25+
26+
let data = [];
27+
const base = vscode.workspace.workspaceFolders[0].uri._fsPath;
28+
29+
// if moving a file all the files must be shown
30+
if (type === ACTIONS_MSG.moveType.file) {
31+
data = await getCurrentDirectoryFiles(base);
32+
}
33+
// if moving a directory all the folders must be shown
34+
// but not the root of the workspace
35+
else {
36+
data = await getCurrentDirectoryFolders(base);
37+
data.shift();
38+
}
39+
40+
data = data.map((d, index) => { return { label: d.label, index } });
41+
42+
// getting the selected folder
43+
const sourceSelected = await vscode.window.showQuickPick(data, {
44+
title: `Select source ${type}`,
45+
matchOnDetail: true,
46+
});
47+
48+
if (sourceSelected === undefined) return;
49+
50+
// if moving a file then quick pick must show folders
51+
// selecting folders
52+
if (type === ACTIONS_MSG.moveType.file)
53+
data = await getCurrentDirectoryFolders(base);
54+
// if moving a directory then the selected directory must be removed
55+
// and the base directory should be added
56+
else {
57+
data.splice(sourceSelected.index, 1);
58+
data.unshift({ label: base })
59+
}
60+
61+
const destinationSelected = await vscode.window.showQuickPick(data, {
62+
title: `Select destination folder`,
63+
matchOnDetail: true
64+
})
65+
66+
if (destinationSelected === undefined) return;
67+
68+
// moving the file
69+
const currOS = process.platform;
70+
const cmd = `${TERMINAL.move[currOS]} ${sourceSelected.label} ${destinationSelected.label}`;
71+
await executeCommand(cmd);
72+
}
73+
catch (err) {
74+
throw new Error(err);
75+
}
76+
}
77+
78+
module.exports = moveFileOrDirectory;

0 commit comments

Comments
 (0)