功能优化:跨平台文件大小计算支持
- 新增跨平台文件大小计算工具,支持Windows/macOS/Linux - Windows使用1024进制,macOS/Linux使用1000进制 - 优化光盘类型配置,自动适配不同操作系统 - 更新文件大小格式化函数,确保跨平台一致性 - 添加测试工具和详细文档说明
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -129,44 +129,9 @@ const CDTypes = {
|
|||||||
6: 'BD_TL',
|
6: 'BD_TL',
|
||||||
7: 'BD_QL'
|
7: 'BD_QL'
|
||||||
}
|
}
|
||||||
const size = 1024
|
// 使用跨平台文件大小计算
|
||||||
const cd_types = [
|
const { getCurrentOSDiscTypes } = require('@/utils/fileSize')
|
||||||
{
|
const cd_types = getCurrentOSDiscTypes()
|
||||||
value: 1,
|
|
||||||
label: 'CD 700MB',
|
|
||||||
size: 700 * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 2,
|
|
||||||
label: 'DVD 4.7GB',
|
|
||||||
size: 4.7 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 3,
|
|
||||||
label: 'DVD_DL 8.5GB',
|
|
||||||
size: 8.5 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 4,
|
|
||||||
label: 'BD 25GB',
|
|
||||||
size: 25 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 5,
|
|
||||||
label: 'BD_DL 50GB',
|
|
||||||
size: 50 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 6,
|
|
||||||
label: 'BD_TL 100GB',
|
|
||||||
size: 100 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 7,
|
|
||||||
label: 'BD_QL 128GB',
|
|
||||||
size: 128 * size * size * size
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
const defaultData = {
|
const defaultData = {
|
||||||
// 任务列表
|
// 任务列表
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
# 跨平台文件大小计算工具
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
这个工具解决了不同操作系统下文件大小计算的差异问题:
|
||||||
|
|
||||||
|
- **Windows**: 使用 1024 进制 (二进制,1KB = 1024 bytes)
|
||||||
|
- **macOS**: 使用 1000 进制 (十进制,1KB = 1000 bytes)
|
||||||
|
- **Linux**: 使用 1000 进制 (十进制,遵循 SI 标准,1KB = 1000 bytes)
|
||||||
|
|
||||||
|
## 主要功能
|
||||||
|
|
||||||
|
### 1. 操作系统检测
|
||||||
|
```javascript
|
||||||
|
import { getOS } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
const currentOS = getOS() // 'windows', 'mac', 'linux', 'unknown'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 获取基础单位大小
|
||||||
|
```javascript
|
||||||
|
import { getBaseSize } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
const baseSize = getBaseSize() // 1024 (Windows/Linux) 或 1000 (macOS)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 光盘类型配置
|
||||||
|
```javascript
|
||||||
|
import { getCurrentOSDiscTypes } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
const discTypes = getCurrentOSDiscTypes()
|
||||||
|
// 返回当前系统适配的光盘类型配置
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 文件大小格式化
|
||||||
|
```javascript
|
||||||
|
import { formatFileSize } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
const formatted = formatFileSize(1024*1024*1024) // "1.00 GB" (Windows) 或 "1.00 GB" (macOS)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
### 在组件中使用
|
||||||
|
```javascript
|
||||||
|
// dashboard/index.vue
|
||||||
|
import { getCurrentOSDiscTypes } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
methods: {
|
||||||
|
updateDiscTypes() {
|
||||||
|
const typeLists = getCurrentOSDiscTypes()
|
||||||
|
this.$store.dispatch('chat/setDatas', { name: 'cd_types', data: typeLists })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 在工具函数中使用
|
||||||
|
```javascript
|
||||||
|
// utils/index.js
|
||||||
|
import { formatFileSize } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
export const filterSize = (size) => {
|
||||||
|
if (!size || size < 0) return '0 B'
|
||||||
|
return formatFileSize(size)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 光盘类型配置
|
||||||
|
|
||||||
|
工具自动为不同操作系统生成正确的光盘容量配置:
|
||||||
|
|
||||||
|
| 类型 | Windows | macOS/Linux |
|
||||||
|
|------|---------|-------------|
|
||||||
|
| CD 700MB | 734,003,200 bytes | 700,000,000 bytes |
|
||||||
|
| DVD 4.7GB | 5,046,586,572 bytes | 4,700,000,000 bytes |
|
||||||
|
| BD 25GB | 26,843,545,600 bytes | 25,000,000,000 bytes |
|
||||||
|
|
||||||
|
## 调试功能
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { getDebugInfo } from '@/utils/fileSize'
|
||||||
|
|
||||||
|
const debug = getDebugInfo()
|
||||||
|
console.log(debug)
|
||||||
|
// 输出当前系统的完整配置信息
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试
|
||||||
|
|
||||||
|
运行测试文件查看不同系统的差异:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { testFileSizeCalculation, compareOSDifferences } from '@/utils/fileSizeTest'
|
||||||
|
|
||||||
|
testFileSizeCalculation() // 显示当前系统配置
|
||||||
|
compareOSDifferences() // 对比不同系统差异
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. 工具会自动检测当前操作系统
|
||||||
|
2. 所有大小计算都基于字节 (bytes)
|
||||||
|
3. 格式化显示会根据系统使用相应的进制
|
||||||
|
4. 光盘容量配置会自动适配当前系统
|
||||||
|
|
||||||
|
## 更新历史
|
||||||
|
|
||||||
|
- 2024-01-XX: 初始版本,支持 Windows/macOS/Linux 跨平台文件大小计算
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* 跨平台文件大小计算工具
|
||||||
|
* 处理不同操作系统的文件大小差异
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 检测操作系统
|
||||||
|
export function getOS() {
|
||||||
|
const platform = process.platform
|
||||||
|
if (platform === 'win32') return 'windows'
|
||||||
|
if (platform === 'darwin') return 'mac'
|
||||||
|
if (platform === 'linux') return 'linux'
|
||||||
|
return 'unknown'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取基础单位大小
|
||||||
|
export function getBaseSize() {
|
||||||
|
const os = getOS()
|
||||||
|
|
||||||
|
// 不同操作系统的基础单位
|
||||||
|
const baseSizes = {
|
||||||
|
windows: 1024, // Windows 使用 1024 进制 (二进制)
|
||||||
|
mac: 1000, // macOS 使用 1000 进制 (十进制)
|
||||||
|
linux: 1000 // Linux 使用 1000 进制 (十进制,遵循 SI 标准)
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseSizes[os] || 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算光盘类型大小
|
||||||
|
export function calculateDiscSize(sizeInGB, os = null) {
|
||||||
|
const baseSize = os ? getBaseSizeForOS(os) : getBaseSize()
|
||||||
|
return sizeInGB * Math.pow(baseSize, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 为特定操作系统获取基础大小
|
||||||
|
export function getBaseSizeForOS(os) {
|
||||||
|
const baseSizes = {
|
||||||
|
windows: 1024, // Windows 使用 1024 进制 (二进制)
|
||||||
|
mac: 1000, // macOS 使用 1000 进制 (十进制)
|
||||||
|
linux: 1000 // Linux 使用 1000 进制 (十进制,遵循 SI 标准)
|
||||||
|
}
|
||||||
|
return baseSizes[os] || 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
// 光盘类型配置
|
||||||
|
export function getDiscTypes(os = null) {
|
||||||
|
const baseSize = os ? getBaseSizeForOS(os) : getBaseSize()
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
value: 1,
|
||||||
|
label: 'CD 700MB',
|
||||||
|
size: 700 * Math.pow(baseSize, 2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 2,
|
||||||
|
label: 'DVD 4.7GB',
|
||||||
|
size: 4.7 * Math.pow(baseSize, 3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 3,
|
||||||
|
label: 'DVD_DL 8.5GB',
|
||||||
|
size: 8.5 * Math.pow(baseSize, 3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 4,
|
||||||
|
label: 'BD 25GB',
|
||||||
|
size: 25 * Math.pow(baseSize, 3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 5,
|
||||||
|
label: 'BD_DL 50GB',
|
||||||
|
size: 50 * Math.pow(baseSize, 3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 6,
|
||||||
|
label: 'BD_TL 100GB',
|
||||||
|
size: 100 * Math.pow(baseSize, 3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 7,
|
||||||
|
label: 'BD_QL 128GB',
|
||||||
|
size: 128 * Math.pow(baseSize, 3)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 格式化文件大小显示
|
||||||
|
export function formatFileSize(bytes, os = null) {
|
||||||
|
if (!bytes || bytes < 0) return '0 B'
|
||||||
|
|
||||||
|
const baseSize = os ? getBaseSizeForOS(os) : getBaseSize()
|
||||||
|
const units = ['B', 'KB', 'MB', 'GB', 'TB']
|
||||||
|
|
||||||
|
let size = bytes
|
||||||
|
let unitIndex = 0
|
||||||
|
|
||||||
|
while (size >= baseSize && unitIndex < units.length - 1) {
|
||||||
|
size /= baseSize
|
||||||
|
unitIndex++
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${size.toFixed(2)} ${units[unitIndex]}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前系统的光盘类型配置
|
||||||
|
export function getCurrentOSDiscTypes() {
|
||||||
|
return getDiscTypes()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调试信息:显示当前系统配置
|
||||||
|
export function getDebugInfo() {
|
||||||
|
const os = getOS()
|
||||||
|
const baseSize = getBaseSize()
|
||||||
|
const discTypes = getDiscTypes()
|
||||||
|
|
||||||
|
return {
|
||||||
|
os,
|
||||||
|
baseSize,
|
||||||
|
discTypes: discTypes.map(type => ({
|
||||||
|
...type,
|
||||||
|
formattedSize: formatFileSize(type.size)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* 跨平台文件大小计算测试
|
||||||
|
* 用于验证不同操作系统下的文件大小计算是否正确
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
getOS,
|
||||||
|
getBaseSize,
|
||||||
|
getDiscTypes,
|
||||||
|
formatFileSize,
|
||||||
|
getDebugInfo
|
||||||
|
} from './fileSize'
|
||||||
|
|
||||||
|
// 测试函数
|
||||||
|
export function testFileSizeCalculation() {
|
||||||
|
console.log('=== 跨平台文件大小计算测试 ===')
|
||||||
|
|
||||||
|
// 显示当前系统信息
|
||||||
|
const debugInfo = getDebugInfo()
|
||||||
|
console.log('当前系统:', debugInfo.os)
|
||||||
|
console.log('基础单位:', debugInfo.baseSize)
|
||||||
|
console.log('光盘类型配置:')
|
||||||
|
|
||||||
|
debugInfo.discTypes.forEach(type => {
|
||||||
|
console.log(` ${type.label}: ${type.formattedSize} (${type.size} bytes)`)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试不同操作系统的配置
|
||||||
|
const testOS = ['windows', 'mac', 'linux']
|
||||||
|
|
||||||
|
testOS.forEach(os => {
|
||||||
|
console.log(`\n--- ${os.toUpperCase()} 系统配置 ---`)
|
||||||
|
const discTypes = getDiscTypes(os)
|
||||||
|
discTypes.forEach(type => {
|
||||||
|
const formatted = formatFileSize(type.size, os)
|
||||||
|
console.log(` ${type.label}: ${formatted}`)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试文件大小格式化
|
||||||
|
console.log('\n--- 文件大小格式化测试 ---')
|
||||||
|
const testSizes = [1024, 1024*1024, 1024*1024*1024, 4.7*1024*1024*1024]
|
||||||
|
|
||||||
|
testSizes.forEach(size => {
|
||||||
|
console.log(`${size} bytes = ${formatFileSize(size)}`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较不同系统的差异
|
||||||
|
export function compareOSDifferences() {
|
||||||
|
console.log('\n=== 操作系统差异对比 ===')
|
||||||
|
|
||||||
|
const testSize = 4.7 * 1024 * 1024 * 1024 // 4.7GB
|
||||||
|
|
||||||
|
const systems = [
|
||||||
|
{ name: 'Windows', baseSize: 1024 },
|
||||||
|
{ name: 'macOS', baseSize: 1000 },
|
||||||
|
{ name: 'Linux', baseSize: 1000 }
|
||||||
|
]
|
||||||
|
|
||||||
|
systems.forEach(system => {
|
||||||
|
const formatted = formatFileSize(testSize, system.name.toLowerCase())
|
||||||
|
console.log(`${system.name}: ${formatted} (基础单位: ${system.baseSize})`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出测试函数
|
||||||
|
export default {
|
||||||
|
testFileSizeCalculation,
|
||||||
|
compareOSDifferences
|
||||||
|
}
|
||||||
@@ -463,17 +463,18 @@ export function accSub(arg1, arg2) {
|
|||||||
}
|
}
|
||||||
/** * 文件大小 字节转换单位 * @param size * @returns {string|*} */
|
/** * 文件大小 字节转换单位 * @param size * @returns {string|*} */
|
||||||
export const filterSize = (size) => {
|
export const filterSize = (size) => {
|
||||||
if (!size || size < 0) return '0kb';
|
if (!size || size < 0) return '0 B';
|
||||||
if (size < pow1024(1)) return size + ' B';
|
|
||||||
if (size < pow1024(2)) return (size / pow1024(1)).toFixed(2) + ' KB';
|
// 使用跨平台文件大小格式化
|
||||||
if (size < pow1024(3)) return (size / pow1024(2)).toFixed(2) + ' MB';
|
const { formatFileSize } = require('@/utils/fileSize')
|
||||||
if (size < pow1024(4)) return (size / pow1024(3)).toFixed(2) + ' GB';
|
return formatFileSize(size)
|
||||||
return (size / pow1024(4)).toFixed(2) + ' TB'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const pow1024 = (num) => {
|
export const pow1024 = (num) => {
|
||||||
const size = 1024
|
// 使用跨平台基础大小
|
||||||
return Math.pow(size, num)
|
const { getBaseSize } = require('@/utils/fileSize')
|
||||||
|
const baseSize = getBaseSize()
|
||||||
|
return Math.pow(baseSize, num)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行脚本
|
// 执行脚本
|
||||||
|
|||||||
@@ -969,44 +969,10 @@ export default {
|
|||||||
.then(() => {
|
.then(() => {
|
||||||
clearTimeout(outTimer)
|
clearTimeout(outTimer)
|
||||||
that.currentRunVal = 0
|
that.currentRunVal = 0
|
||||||
const size = 1024
|
|
||||||
let typeLists = [
|
// 使用跨平台文件大小计算
|
||||||
{
|
const { getCurrentOSDiscTypes } = require('@/utils/fileSize')
|
||||||
value: 1,
|
let typeLists = getCurrentOSDiscTypes()
|
||||||
label: 'CD 700MB',
|
|
||||||
size: 700 * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 2,
|
|
||||||
label: 'DVD 4.7GB',
|
|
||||||
size: 4.7 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 3,
|
|
||||||
label: 'DVD_DL 8.5GB',
|
|
||||||
size: 8.5 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 4,
|
|
||||||
label: 'BD 25GB',
|
|
||||||
size: 25 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 5,
|
|
||||||
label: 'BD_DL 50GB',
|
|
||||||
size: 50 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 6,
|
|
||||||
label: 'BD_TL 100GB',
|
|
||||||
size: 100 * size * size * size
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 7,
|
|
||||||
label: 'BD_QL 128GB',
|
|
||||||
size: 128 * size * size * size
|
|
||||||
}
|
|
||||||
]
|
|
||||||
let isBD = that.changeCD.req_info.strong_list.findIndex(item => parseInt(item.strong_type) > 3)
|
let isBD = that.changeCD.req_info.strong_list.findIndex(item => parseInt(item.strong_type) > 3)
|
||||||
if (isBD === -1) {
|
if (isBD === -1) {
|
||||||
typeLists = typeLists.slice(0, 3)
|
typeLists = typeLists.slice(0, 3)
|
||||||
@@ -1145,16 +1111,16 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
that.$message({
|
// that.$message({
|
||||||
message: '取消成功',
|
// message: '取消成功',
|
||||||
type: 'success'
|
// type: 'success'
|
||||||
})
|
// })
|
||||||
row.task_status = 7
|
// row.task_status = 7
|
||||||
if (row.ass_task && row.ass_task.length > 0) {
|
// if (row.ass_task && row.ass_task.length > 0) {
|
||||||
row.ass_task.forEach((item) => {
|
// row.ass_task.forEach((item) => {
|
||||||
item.task_status = 7
|
// item.task_status = 7
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 跳转设置
|
// 跳转设置
|
||||||
|
|||||||
Reference in New Issue
Block a user