标签“文件系统”出现问题

2023-12-19

出于娱乐原因,我编写了一个 PHP 类,它用标签对文件进行分类,而不是以分层方式进行分类,标签以 +tag1+tag2+tagN+MD5.EXTENSION 的形式存储在文件名本身中,因此我坚持使用FS/OS 施加的字符限制 (255)。这是课程:

<?php

class TagFS
{
    public $FS = null;

    function __construct($FS)
    {
        if (is_dir($FS) === true)
        {
            $this->FS = $this->Path($FS);
        }
    }

    function Add($path, $tag)
    {
        if (is_dir($path) === true)
        {
            $files = array_slice(scandir($path), 2);

            foreach ($files as $file)
            {
                $this->Add($this->Path($path) . $file, $tag);
            }

            return true;
        }

        else if (is_file($path) === true)
        {
            $file = md5_file($path);

            if (is_file($this->FS . $file) === false)
            {
                if (copy($path, $this->FS . $file) === false)
                {
                    return false;
                }
            }

            return $this->Link($this->FS . $file, $this->FS . '+' . $this->Tag($tag) . '+' . $file . '.' . strtolower(pathinfo($path, PATHINFO_EXTENSION)));
        }

        return false;
    }

    function Get($tag)
    {
        return glob($this->FS . '*+' . str_replace('+', '{+,+*+}', $this->Tag($tag)) . '+*', GLOB_BRACE);
    }

    function Link($source, $destination)
    {
        if (is_file($source) === true)
        {
            if (function_exists('link') === true)
            {
                return link($source, $destination);
            }

            if (is_file($destination) === false)
            {
                exec('fsutil hardlink create "' . $destination . '" "' . $source . '"');

                if (is_file($destination) === true)
                {
                    return true;
                }
            }
        }

        return false;
    }

    function Path($path)
    {
        if (file_exists($path) === true)
        {
            $path = str_replace('\\', '/', realpath($path));

            if ((is_dir($path) === true) && ($path[strlen($path) - 1] != '/'))
            {
                $path .= '/';
            }

            return $path;
        }

        return false;
    }

    function Tag($string)
    {
        /*
        TODO:
        Remove (on Windows):            . \ / : * ? " < > |
        Remove (on *nix):               . /
        Remove (on TagFS):              + * { }
        Remove (on TagFS - Possibly!)   -
        Max Chars (in Windows)          255
        Max Char (in *nix)              255
        */

        $result = array_filter(array_unique(explode(' ', $string)));

        if (empty($result) === false)
        {
            if (natcasesort($result) === true)
            {
                return strtolower(implode('+', $result));
            }
        }

        return false;
    }
}

?>

我相信这个系统对于几个小标签来说效果很好,但我的问题是当整个文件名的大小超过 255 个字符时。我应该采取什么方法来绕过文件名限制?我正在考虑在同一文件的几个硬链接上拆分标签,但排列可能会杀死系统。

还有其他方法可以解决这个问题吗?

编辑-一些用法示例:

<?php

$images = new TagFS('S:');

$images->Add('P:/xampplite/htdocs/tag/geoaki.png', 'geoaki logo');
$images->Add('P:/xampplite/htdocs/tag/cloud.jpg', 'geoaki cloud tag');
$images->Add('P:/xampplite/htdocs/tag/cloud.jpg', 'nuvem azul branco');
$images->Add('P:/xampplite/htdocs/tag/xml-full.gif', 'geoaki auto vin api service xml');
$images->Add('P:/xampplite/htdocs/tag/dunp3d-1.jpg', 'dunp logo');
$images->Add('P:/xampplite/htdocs/tag/d-proposta-04c.jpg', 'dunp logo');

/*
[0] => S:/+api+auto+geoaki+service+vin+xml+29be189cbc98fcb36a44d77acad13e18.gif
[1] => S:/+azul+branco+nuvem+4151ae7900f33788d0bba5fc6c29bee3.jpg
[2] => S:/+cloud+geoaki+tag+4151ae7900f33788d0bba5fc6c29bee3.jpg
[3] => S:/+dunp+logo+0cedeb6f66cbfc3974c6b7ad86f4fbd3.jpg
[4] => S:/+dunp+logo+8b9fcb119246bb6dcac1906ef964d565.jpg
[5] => S:/+geoaki+logo+5f5174c498ffbfd9ae49975ddfa2f6eb.png
*/
echo '<pre>';
print_r($images->Get('*'));
echo '</pre>';

/*
[0] => S:/+azul+branco+nuvem+4151ae7900f33788d0bba5fc6c29bee3.jpg
*/
echo '<pre>';
print_r($images->Get('azul nuvem'));
echo '</pre>';

/*
[0] => S:/+dunp+logo+0cedeb6f66cbfc3974c6b7ad86f4fbd3.jpg
[1] => S:/+dunp+logo+8b9fcb119246bb6dcac1906ef964d565.jpg
[2] => S:/+geoaki+logo+5f5174c498ffbfd9ae49975ddfa2f6eb.png
*/
echo '<pre>';
print_r($images->Get('logo'));
echo '</pre>';

/*
[0] => S:/+dunp+logo+0cedeb6f66cbfc3974c6b7ad86f4fbd3.jpg
[1] => S:/+dunp+logo+8b9fcb119246bb6dcac1906ef964d565.jpg
*/
echo '<pre>';
print_r($images->Get('logo dunp'));
echo '</pre>';

/*
[0] => S:/+geoaki+logo+5f5174c498ffbfd9ae49975ddfa2f6eb.png
*/
echo '<pre>';
print_r($images->Get('geo* logo'));
echo '</pre>';

?>

编辑:由于使用无服务器数据库或任何其他类型的查找表(XML、平面、键/值对等)的一些建议,我想澄清以下内容:虽然此代码是用 PHP 编写的,但其想法是将其移植到 Python 并用它制作一个桌面应用程序 - 这与 PHP 无关(当然除了示例之外)。此外,如果我必须使用某种查找表 我肯定会使用 SQLite 3,但我正在寻找的是一种除了文件系统(文件夹、文件和硬链接)之外不涉及任何其他附加“技术”的解决方案。

你可能会说我疯了,但我在这里试图实现两个简单的目标:1)保持系统“垃圾”免费(例如谁喜欢 Thumbs.db 或 DS_STORE?)和 2)保持文件易于识别(如果出于某种原因)查找表(在本例中为 SQLite)变得繁忙、损坏、丢失或忘记(例如在备份中)。

PS:这应该可以在 Linux、Mac 和 Windows(NTFS 下)上运行。


如果您使用硬/软链接,那么您可能会考虑为每个标签提供它自己的目录,其中包含带有该“标签”的每个文件的链接。然后,当您获得多个标签时,您可以比较在两个标签中找到的标签。然后,这些文件可以存储在一个文件夹中,并且它们的名称当然是唯一的。

我不知道这与拥有由标签命名的元文件,然后列出该标签中存在的所有文件有何不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标签“文件系统”出现问题 的相关文章

  • 搜索引擎如何找到相关内容? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google 在解析网络时如何找到相关内容 例如 Google 使用 PHP 原生 DOM 库来解析内
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • 如何使用 php 下载/打印页面的特定部分

    我有一个 HTML 页面如下 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been the indust
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 文件头或一般注释

    有人对文件有结构良好的起始评论吗 我正在寻找看起来不错的东西 要么很花哨 要么很专业 我所说的一般注释是指文件顶部的注释 显示您的名称和文件的用途 像这个 hello program to print out Hello World Aut
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • 为什么 Composer 降级了我的包?

    php composer phar update这样做了 删除了 2 3 0 软件包并安装了整个 2 2 5 Zend Framework php composer phar update Loading composer reposito
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a

随机推荐

  • 如何调用从 C++ 导入的包中定义的 julia 方法?

    我需要一个 C 库来计算复杂参数的多伽玛函数 经过一番谷歌搜索后我发现了这一点 https scicomp stackexchange com questions 23194 i am searching for c code of the
  • 如何更改 PrimeFaces 中面板网格的列宽

    我正在使用 Java EE 和 PrimeFaces 如何更改 PrimeFaces 中面板网格的列宽 有例子吗 您可以使用columnClasses 限定panelGrid 内的列 以下代码设置不同的宽度并将单元格内容与顶部对齐
  • 使用jquery自动完成标签时的utf-8问题

    嘿伙计们 最近我使用jquery自动完成标签 http devthought com projects jquery textboxlist http devthought com projects jquery textboxlist 一
  • 检查字符串中的(仅整个)单词

    Checkio 上的培训 该任务称为流行词 任务是从给定字符串的 字符串 列表中搜索单词 例如 textt When I was One I had just begun When I was Two I was nearly new ww
  • 如何摆脱 PHP 注意:第 123 行 X 中的未定义索引:HTTPS

    我刚刚发现我有数千个此类错误 来自两个相同的文件 我通过使用删除了很多错误isset 但我不知道如何消除最后两个错误 也许你们可以帮助我 PHP Notice Undefined index HTTPS on xxx xxx xxx php
  • 如何验证脚本中的视频文件?

    我有一个包含大量视频文件的服务器 恢复后 我注意到几个文件的校验和发生了变化 由于我没有所有文件的校验和 因此我想编写一个脚本来验证文件完整性 对于档案来说很简单 tar t unzip t rar t等 或图像 convert image
  • 如何从 MSBuild 指定规则集

    升级到 VS 2010 MSBUILD p RunCodeAnalysis true 后无法按预期工作 msbuild solution sln p RunCodeAnalysis true 为了获得更快的构建 我们删除了 DEBUG 构建
  • 对 API 进行速率限制 (spring MVC)

    我正在寻找最有效的方法来实现 或使用已经设置的 速率限制器 以保护我所有的其余 api url 我正在寻找的保护是 每用户每秒调用限制器 我上网查了一下 结果是使用 Redis 或 Guava RateLimiter 说实话我没用过Redi
  • 请解释一下Android中的Context类

    我是安卓新手 有人可以向我解释一下 Context 类 对象的概念吗 这是什么 它将用来做什么 为什么是 Context 类 你见过吗安卓开发者指南 http developer android com reference android
  • 多个点能否组成一个圆? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我有例如20个点 我如何检查这些
  • 通过代码在换行单元格中插入换行符

    Is it possible to insert line break in a wrapped cell through VBA code similar to doing Alt Enter when entering data man
  • 当 React 已经渲染时无法刷新更新

    我试图在 API 返回错误时显示警报 对于警报窗口 我使用 sweetalert2 在我的渲染方法中 我正在检查错误消息是否包含内容 如果它包含错误消息 我想向用户显示警报 当我提交表单时 我会进行 API 调用 如果返回错误 reduce
  • 在 Linq 中返回单个列表属性 List

    我在这里遇到问题 我有一个列表 this Ddown 有 3 个属性 我想编写一个 Linq 查询来返回其中一个属性 假设我有属性 a b c 我想返回列表 c 我如何在 linq 中做到这一点 var listOfC this Ddown
  • 如何向直方图添加颜色条?

    I have a histogram like this just like a normal histogram 在我的情况下 总是有 20 个条形 x 轴从 0 到 1 并且条形的颜色是根据 x 轴上的值定义的 我想要的是添加一个色谱
  • TeamCity GitHub 私钥访问被拒绝

    有谁知道使用 TeamCity 与 github 和 ssh 私钥的教程 我尝试设置 git hub 进行连接 但要么出现身份验证错误 要么访问被拒绝 我在 Windows 2003 上运行 TeamCity 我将构建代理作为自定义帐户运行
  • 在 SPSS 宏中循环遍历并行列表/数组

    我想编写一个SPSS宏来执行三个操作 生成自定义表 清洁输出窗口 导出表 如您所知 SPSS 宏工具允许使用两种类型的循环 数字 如 do i x to y 和 list for every 像 do i in 1 我的目标是创建一个带有如
  • 是否可以在没有 REST 请求的情况下创建 Kafka 连接器?

    是否可以在没有 REST 请求的情况下创建 Kafka 连接器 我已经通过 java 代码启动了我的工作程序 分布式 并希望我的连接器也随之启动 我不想使用 REST 调用 不是来自浏览器 也不是来自代码 来创建我的连接器 我只想要一个简单
  • codeigniter 数据库移动到另一个表

    如何解决这个 codeigniter 问题 我有一个数据库表 Mysql 我需要使用 Php Codeigniter 框架将其所有字段内容移动到另一个表 将数据从一个表插入到另一个可在我的模型和控制器中使用的表的语法是什么 我尝试使用这些
  • Angular 2 核心模块和功能模块的区别

    我不明白之间的区别core https angular io docs ts latest guide ngmodule html core module and feature https angular io docs ts lates
  • 标签“文件系统”出现问题

    出于娱乐原因 我编写了一个 PHP 类 它用标签对文件进行分类 而不是以分层方式进行分类 标签以 tag1 tag2 tagN MD5 EXTENSION 的形式存储在文件名本身中 因此我坚持使用FS OS 施加的字符限制 255 这是课程