feat: 添加复制相关逻辑,修复文件夹剪切无法正常执行的错误
This commit is contained in:
1 parent
089dc68419
commit
cb8198d1bb
12 files changed
+418
-5
No files matched your search
@@ -0,0 +1,174 @@
|
||||
import { VirtualDirectory, VirtualFile } from '@/class/VirtualDirectory'
|
||||
import { usePluginHooksType } from '@/types/type'
|
||||
|
||||
// 用于存储复制的项目
|
||||
let copiedItems: {
|
||||
files: VirtualFile[],
|
||||
directories: VirtualDirectory[],
|
||||
isCut: boolean
|
||||
} = {
|
||||
files: [],
|
||||
directories: [],
|
||||
isCut: false
|
||||
}
|
||||
|
||||
// 复制或剪切虚拟项目
|
||||
const copyItems = (vDirs: VirtualDirectory[], vFiles: VirtualFile[], hooks: usePluginHooksType, isCut = false) => {
|
||||
const { globalAlertTip } = hooks
|
||||
|
||||
// 保存复制的项目
|
||||
copiedItems = {
|
||||
files: [...vFiles],
|
||||
directories: [...vDirs],
|
||||
isCut
|
||||
}
|
||||
|
||||
// 生成消息文本
|
||||
const fileCount = vFiles.length
|
||||
const dirCount = vDirs.length
|
||||
let messageText = ''
|
||||
|
||||
if (fileCount > 0 && dirCount > 0) {
|
||||
messageText = `已${isCut ? '剪切' : '复制'} ${fileCount}个文件和${dirCount}个文件夹`
|
||||
} else if (fileCount > 0) {
|
||||
messageText = `已${isCut ? '剪切' : '复制'} ${fileCount}个文件`
|
||||
} else if (dirCount > 0) {
|
||||
messageText = `已${isCut ? '剪切' : '复制'} ${dirCount}个文件夹`
|
||||
}
|
||||
|
||||
// 显示提示
|
||||
globalAlertTip(messageText, {
|
||||
type: 'info',
|
||||
timeout: 2000
|
||||
})
|
||||
}
|
||||
|
||||
// 粘贴虚拟项目
|
||||
const pasteItems = async (vDirs: VirtualDirectory[], _vFiles: VirtualFile[], hooks: usePluginHooksType) => {
|
||||
const { globalAlertTip, getRootVDirectory } = hooks
|
||||
|
||||
// 检查目标目录
|
||||
if (vDirs.length !== 1) {
|
||||
globalAlertTip('请选择一个目标文件夹进行粘贴', {
|
||||
type: 'error',
|
||||
timeout: 2000
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否有复制的项目
|
||||
if (copiedItems.files.length === 0 && copiedItems.directories.length === 0) {
|
||||
globalAlertTip('没有可粘贴的项目', {
|
||||
type: 'info',
|
||||
timeout: 2000
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
const targetDir = vDirs[0]
|
||||
let successCount = 0
|
||||
let failCount = 0
|
||||
|
||||
// 处理粘贴文件
|
||||
for (const file of copiedItems.files) {
|
||||
try {
|
||||
if (copiedItems.isCut) {
|
||||
// 剪切操作
|
||||
const success = await file.moveTo(targetDir)
|
||||
if (success) {
|
||||
successCount++
|
||||
} else {
|
||||
failCount++
|
||||
}
|
||||
} else {
|
||||
// 复制操作
|
||||
const success = await file.copyTo(targetDir)
|
||||
if (success) {
|
||||
successCount++
|
||||
} else {
|
||||
failCount++
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('粘贴文件失败:', err)
|
||||
failCount++
|
||||
}
|
||||
}
|
||||
|
||||
// 处理粘贴目录
|
||||
for (const dir of copiedItems.directories) {
|
||||
try {
|
||||
if (copiedItems.isCut) {
|
||||
// 目录移动 - 使用mv方法而不是moveTo
|
||||
const success = await dir.mv(targetDir)
|
||||
if (success) {
|
||||
successCount++
|
||||
} else {
|
||||
failCount++
|
||||
}
|
||||
} else {
|
||||
// 目录复制
|
||||
const success = await dir.copy(targetDir)
|
||||
if (success) {
|
||||
successCount++
|
||||
} else {
|
||||
failCount++
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('粘贴目录失败:', err)
|
||||
failCount++
|
||||
}
|
||||
}
|
||||
|
||||
// 如果是剪切操作,粘贴后清空复制的项目
|
||||
if (copiedItems.isCut && successCount > 0) {
|
||||
copiedItems = {
|
||||
files: [],
|
||||
directories: [],
|
||||
isCut: false
|
||||
}
|
||||
}
|
||||
|
||||
// 显示操作结果
|
||||
if (successCount > 0 && failCount === 0) {
|
||||
globalAlertTip(`成功${copiedItems.isCut ? '移动' : '复制'}了${successCount}个项目`, {
|
||||
type: 'success',
|
||||
timeout: 2000
|
||||
})
|
||||
} else if (successCount > 0 && failCount > 0) {
|
||||
globalAlertTip(`${successCount}个项目成功,${failCount}个项目失败`, {
|
||||
type: 'info',
|
||||
timeout: 2000
|
||||
})
|
||||
} else {
|
||||
globalAlertTip('操作失败', {
|
||||
type: 'error',
|
||||
timeout: 2000
|
||||
})
|
||||
}
|
||||
|
||||
// 更新目录
|
||||
try {
|
||||
// 使用update方法更新根目录
|
||||
const rootDir = getRootVDirectory();
|
||||
await rootDir.update();
|
||||
} catch (err) {
|
||||
console.error('更新目录失败:', err);
|
||||
}
|
||||
}
|
||||
|
||||
// 复制功能
|
||||
export const copy = (vDirs: VirtualDirectory[], vFiles: VirtualFile[], hooks: usePluginHooksType) => {
|
||||
copyItems(vDirs, vFiles, hooks, false)
|
||||
}
|
||||
|
||||
// 剪切功能
|
||||
export const cut = (vDirs: VirtualDirectory[], vFiles: VirtualFile[], hooks: usePluginHooksType) => {
|
||||
copyItems(vDirs, vFiles, hooks, true)
|
||||
}
|
||||
|
||||
// 粘贴功能
|
||||
export const paste = (vDirs: VirtualDirectory[], vFiles: VirtualFile[], hooks: usePluginHooksType) => {
|
||||
pasteItems(vDirs, vFiles, hooks)
|
||||
}
|
||||
Reference in new issue
Block a user