当前位置: 代码网 > it编程>前端脚本>Node.js > node管理统计文件大小并显示目录磁盘空间状态从零实现

node管理统计文件大小并显示目录磁盘空间状态从零实现

2024年05月19日 Node.js 我要评论
explorer-manager新增依赖pnpm i node-df get-folder-sizenode-df 执行 linux 的 df 命令,并将内容格式化为 node 可直接使用结构get-

explorer-manager

新增依赖

pnpm i node-df get-folder-size
  • node-df 执行 linux 的 df 命令,并将内容格式化为 node 可直接使用结构
  • get-folder-size 快速统计文件夹占用大小

创建对应方法

分析文件夹大小

import getfoldersize from 'get-folder-size'
export const getfoldersizeaction = async (path) => {
  return await getfoldersize.loose(formatpath(path))
}

执行 df 命令文件

explorer-manager/src/df.mjs

import df from 'node-df'
import { formatpath } from './format-path.mjs'
/**
 *
 * @param {import('./type').dfopttype} opt
 * @returns {promise<import('./type').dfresitemtype[]>}
 */
export const getdf = async (opt = {}) => {
  return new promise((res, rej) => {
    df(opt, (error, response) => {
      if (error) {
        rej(error)
      }
      res(response)
    })
  })
}
export const finddfinfo = async (path = '') => {
  const info = await getdf()
  const join_path = formatpath(path)
  return info
    .filter((item) => {
      return join_path.includes(item.mount)
    })
    .pop()
}

对应 type 文件

export type dfresitemtype = {
  filesystem: string
  size: number
  used: number
  available: number
  capacity: number
  mount: string
}
export type dfopttype = partial<{
  file: string
  prefixmultiplier: 'kib|mib|gib|tib|pib|eib|zib|yib|mb|gb|tb|pb|eb|zb|yb'
  isdisplayprefixmultiplier: boolean
  precision: number
}>

explorer

读取文件夹大小,一个按钮放置在点击卡片右上角的 “…” 的下拉菜单内的“信息”菜单内。一个位于卡片视图的左下角,有个icon,点击后计算当前文件夹大小。

读取文件夹大小

创建 floder-size 组件,

里面包含一个 foldersize 组件,用于显示完整文案 “文件夹大小:[size]”

一个 foldersizebtn,用于点击时加载 size 文案

'use client'
import react, { usestate } from 'react'
import { userequest } from 'ahooks'
import axios, { axiosrequestconfig } from 'axios'
import { restype } from '@/app/path/api/get-folder-size/route'
import bit from '@/components/bit'
import { loadingoutlined, reloadoutlined } from '@ant-design/icons'
import { button } from 'antd'
const getfoldersize = (config: axiosrequestconfig) => axios.get<restype>('/path/api/get-folder-size', config)
const usegetfoldersize = (path: string) => {
  const { data: size, loading } = userequest(() =>
    getfoldersize({ params: { path: path } }).then(({ data }) => {
      return data.data
    }),
  )
  return { size, loading }
}
const foldersize: react.fc<{ path: string; title?: string | null }> = ({ path, title = '文件夹大小' }) => {
  const { size, loading } = usegetfoldersize(path)
  return <>{loading ? <loadingoutlined /> : <bit title={title}>{size}</bit>}</>
}
export const foldersizebtn: react.fc<{ path: string }> = ({ path }) => {
  const [show, changeshow] = usestate(false)
  return (
    <>
      {show ? (
        <foldersize path={path} title={null} />
      ) : (
        <button icon={<reloadoutlined />} onclick={() => changeshow(true)} />
      )}
    </>
  )
}
export default foldersize

加入 下拉菜单中

if (item.is_directory || is_show_img_exif) {
    menu.items?.push({
      icon: <infooutlined />,
      label: '信息',
      key: 'info',
      onclick: () => {
        if (item.is_directory) {
          modal.info({ title: path, content: <foldersize path={path} />, width: 500 })
        } else {
          changeimgexif(preview_path)
        }
      },
    })
  }

判断当是目录时,直接弹出 modal.info 窗口,内容为 foldersize 组件。

card-display.tsx 加入下面修改

...
import { foldersizebtn } from '@/components/folder-size'
import { usereplacepathname } from '@/components/use-replace-pathname'
const carddisplay: react.fc = () => {
...
  const { joinsearchpath, joinpath } = usereplacepathname()
  return (
...
                  <flex flex="1 0 auto" style={{ marginright: 20 }}>
                    {item.is_directory ? (
                      <foldersizebtn path={joinsearchpath(item.name)} />
                    ) : (
                      <bit>{item.stat.size}</bit>
                    )}
                  </flex>
...
  )
}
export default carddisplay

显示当前目录磁盘空间状态

创建上下文文件

'use client'
import createctx from '@/lib/create-ctx'
import { dfresitemtype } from '@/explorer-manager/src/type'
import react, { useeffect } from 'react'
import { userequest } from 'ahooks'
import axios from 'axios'
import { usepathname } from 'next/navigation'
import bit from '@/components/bit'
import { space } from 'antd'
import { usereplacepathname } from '@/components/use-replace-pathname'
export const dfcontext = createctx<dfresitemtype | null>(null!)
const updatedfinfo: react.fc = () => {
  const pathname = usepathname()
  const { replace_pathname } = usereplacepathname()
  const dispatch = dfcontext.usedispatch()
  const { data = null } = userequest(() =>
    axios
      .get<{ data: dfresitemtype }>('/path/api/get-df', { params: { path: replace_pathname } })
      .then(({ data }) => data.data),
  )
  useeffect(() => {
    dispatch(data)
  }, [data, dispatch, pathname])
  return null
}
export const dfdisplay: react.fc = () => {
  const store = dfcontext.usestore()
  return (
    <space split="/">
      <bit>{store?.available}</bit>
      <bit>{store?.size}</bit>
    </space>
  )
}
export const dfprovider: react.fc<react.propswithchildren> = ({ children }) => {
  return (
    <dfcontext.contextprovider value={null}>
      <updatedfinfo />
      {children}
    </dfcontext.contextprovider>
  )
}

分别将 dfprovider 组件插入 公共 explorer/src/app/path/context.tsx 内

+import { dfprovider } from '@/components/df-context'

             <videopathprovider>
               <imgexifprovider>
                 <movepathprovider>
+                  <renameprovider>
+                    <dfprovider>{children}</dfprovider>
+                  </renameprovider>
                 </movepathprovider>
               </imgexifprovider>
             </videopathprovider>

dfdisplay 显示组件插入 explorer/src/app/path/[[...path]]/layout-footer.tsx 内

+import { dfdisplay } from '@/components/df-context'
+import { reloadreaddirbutton } from '@/components/reload-readdir-button'
 const layoutfooter: react.fc = () => {
   return (
@@ -12,12 +14,20 @@ const layoutfooter: react.fc = () => {
       <flex style={{ width: '100%', height: '40px' }} align="center">
         <flex flex={1}>
           <space>
+            <space.compact>
+              <reloadreaddirbutton />
+
+              <createfolderbtn />
+            </space.compact>
             <readdircount />
           </space>
         </flex>
+        <flex flex={1} justify="center" align="center">
+          <dfdisplay />
+        </flex>
+
         <flex justify="flex-end" flex={1}>
           <space>
             <changecolumn />

效果

git-repo

yangws29/share-explorer

以上就是node统计文件大小并显示目录磁盘空间状态从零实现的详细内容,更多关于node统计文件大小磁盘空间的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com