174 lines
4.9 KiB
TypeScript
174 lines
4.9 KiB
TypeScript
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)
|
|
}
|