当前位置: 首页 > news >正文

fuse-python使用fuse来挂载fs

winfsp

安装winfsp,https://winfsp.dev/

挂载window目录

python安装fusepy

#!/usr/bin/env python3
import os
import stat
from fuse import FUSE, FuseOSError, Operations

class Passthrough(Operations):
    def __init__(self, root):
        self.root = root

    # 辅助函数:将挂载点路径转换为根目录路径
    def _full_path(self, partial):
        if partial.startswith("/"):
            partial = partial[1:]
        path = os.path.join(self.root, partial)
        return path

    # 获取文件或目录的属性
    def getattr(self, path, fh=None):
        full_path = self._full_path(path)
        st = os.lstat(full_path)
        return dict((key, getattr(st, key)) for key in ('st_atime', 'st_ctime',
                     'st_gid', 'st_mode', 'st_mtime', 'st_nlink', 'st_size', 'st_uid'))

    # 读取目录内容
    def readdir(self, path, fh):
        full_path = self._full_path(path)
        dirents = ['.', '..']
        if os.path.isdir(full_path):
            dirents.extend(os.listdir(full_path))
        for r in dirents:
            yield r

    # 打开文件
    def open(self, path, flags):
        full_path = self._full_path(path)
        return os.open(full_path, flags)

    # 读取文件内容
    def read(self, path, length, offset, fh):
        os.lseek(fh, offset, os.SEEK_SET)
        return os.read(fh, length)

def main(mountpoint, root):
    try:
        FUSE(Passthrough(root), mountpoint, nothreads=True, foreground=True)
    except Exception as e:
        print(f"Error: {e}")

if __name__ == '__main__':
    import sys
    if len(sys.argv) != 3:
        print('usage: %s <root> <mountpoint>' % sys.argv[0])
        sys.exit(1)
    main(sys.argv[2],sys.argv[1])

pyinstaller --onefile mount.py

打包成mount命令

mount d:\ z:

在这里插入图片描述

挂载http文件服务

import os
import requests
from fuse import FUSE, FuseOSError, Operations


class HTTPFuse(Operations):
    def __init__(self, base_url):
        self.base_url = base_url

    def getattr(self, path, fh=None):
        if path == '/':
            # 根目录属性
            return {
                'st_mode': (stat.S_IFDIR | 0o755),
                'st_nlink': 2
            }
        url = self.base_url + path.lstrip('/')
        try:
            response = requests.head(url)
            if response.status_code == 200:
                size = int(response.headers.get('Content-Length', 0))
                return {
                    'st_mode': (stat.S_IFREG | 0o444),
                    'st_nlink': 1,
                    'st_size': size
                }
            else:
                raise FuseOSError(2)  # 2 表示文件或目录不存在
        except requests.RequestException:
            raise FuseOSError(2)

    def readdir(self, path, fh):
        # 这里简单假设没有子目录,仅返回当前文件列表
        if path == '/':
            # 可以通过解析页面或者其他方式获取文件列表,这里简化处理
            yield '.'
            yield '..'
            # 这里假设可以通过某种方式获取文件列表,此处简化示例
            # 实际中可能需要解析页面或者调用 API 获取
            # 示例代码只是占位,需要根据实际情况修改
            # 假设我们知道有两个文件
            yield 'file1.txt'
            yield 'file2.txt'

    def read(self, path, length, offset, fh):
        url = self.base_url + path.lstrip('/')
        try:
            response = requests.get(url, headers={'Range': f'bytes={offset}-{offset + length - 1}'})
            if response.status_code == 206:  # 206 表示部分内容
                return response.content
            elif response.status_code == 200:  # 可能不支持 Range 请求
                return response.content[offset:offset + length]
            else:
                raise FuseOSError(2)
        except requests.RequestException:
            raise FuseOSError(2)


def main(mountpoint, base_url):
    FUSE(HTTPFuse(base_url), mountpoint, nothreads=True, foreground=True)


if __name__ == '__main__':
    import sys
    if len(sys.argv) != 3:
        print('usage: %s  <base_url> <mountpoint>' % sys.argv[0])
        sys.exit(1)
    main(sys.argv[2],sys.argv[1])
http://www.dtcms.com/a/122973.html

相关文章:

  • 汽车软件开发常用的建模工具汇总
  • Joomla 常用模块 - 在线用户与Joomla 常用模块 - 自定义HTML模块
  • [leetcode]判断质数
  • 关于C++日志库spdlog
  • JS 函数提升
  • 蓝桥杯十一届C++B组真题题解
  • 革新电销流程,数企云外呼开启便捷 “直通车”
  • 各种场景的ARP攻击描述笔记(超详细)
  • stream流Collectors.toMap(),key值重复问题
  • Bootstrap Table动态修改列标题
  • C++中命名空间namespace|头文件h文件|源文件cpp文件详解
  • pyecharts常用图形
  • Mysql索引(二)
  • 8.第二阶段x64游戏实战-string类
  • UE学习记录part15
  • ffpyplayer+Qt,制作一个视频播放器
  • 玩转Docker | 使用Docker安装FileDrop文件共享工具
  • 如何解【决泛型作为运行时参数】时类型擦除问题
  • PowerBI数据建模2:计算选项、计算组
  • JavaScript实用API
  • 计算机视觉4——特征点及其描述子
  • LeetCode344反转字符串
  • 亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景
  • 1. 两数之和 leetcode
  • 后缀自动机SAM练习笔记 (一)
  • Pandas-按索引从df中读取指定一个或者多个元素
  • Pytorch Dataset问题解决:数据集读取报错DatasetGenerationError或OSError
  • win10离线环境下配置wsl2和vscode远程开发环境
  • spark-Core
  • 基于vue3与supabase系统认证机制