代码之家  ›  专栏  ›  技术社区  ›  Marquee

重新保存之前无法识别从zip提取的文件

  •  0
  • Marquee  · 技术社区  · 8 年前

    问:为什么重新保存文件与直接从zip文件提取文件不同?尤其是在窗户上?

    上下文

    我有一个角度应用程序,准备一个文本文件导入到商业机器。为了方便用户使用,我们在zip文件中提供了该文件,以便向用户提供所需的文件夹结构。他们把这个文件写到一个USB驱动器上,然后用它导入机器。

    问题

    如果直接将下载的zip文件提取到USB(以获取文件和所需的文件夹结构),则机器无法识别嵌入的文本文件。

    故障排除

    如果我在任何文本编辑器中打开该文件,添加一个空间,删除该空间,然后在USB上重新保存该文件,那么机器将识别该文件。或者,如果我将zip解压缩到本地文件系统,然后将文件夹结构从本地文件系统复制到USB,那么机器也会识别它。

    如果我切换到Linux,那么nano的“写”将修复该文件。如果我在文件上使用touch命令,问题仍然存在。

    由于怀疑空白/行尾问题,我尝试了几种不同的工具,但没有发现明显的差异:

    • $ diff original.txt resaved.txt (Linux)
    • $ vbindiff original.txt resaved.txt (Linux)
    • > fc /b original.txt resaved.txt (Windows 7)

    其他信息:

    • 角度版本:5.2.10
    • 角度中的zip实用程序:jszip 3.1.5
    • 解压缩实用程序:7-zip和本机Windows资源管理器解压缩

    JSzip代码:

    const zip = new JSZip();
    zip.folder('FolderA/FolderB/FolderC').file('FILE.TXT', new File([contentString], 'TEMP.TXT', { type: 'text/plain' }));
    zip.generateAsync({ type: 'blob' })
      .then(function (content) {
        saveAs(content, 'ZipFile.ZIP');
      });
    

    在这一点上,我没有主意。希望这里的人能对这种奇怪的行为有所了解。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Marquee    8 年前

    tl;dr:检查文件属性(例如存档、只读、隐藏、系统等)。

    我们的系统专门寻找存档位,并以任何方式修改文件来设置这个位。


    这是一个难看的发现,但与我们的嵌入式系统程序员聊天一点导致了答案。

    我们的机器在搜索要导入的文件时专门搜索存档位(windows文件属性)。这个位是来自WindowsNTFS的旧位,已接近过时。无论出于何种目的,它都是一个脏标志,用于指出在下一次备份运行中应该存档/备份的文件。有很多更好的方法可以做到这一点,所以它已经过时了。

    但是,无论出于什么原因,我们的系统只搜索具有该位集的文件。这就是为什么打开/复制/移动文件会解决这个问题,因为以任何方式更改文件都会设置这个存档位(脏标志)。

    如果您想了解更多信息,请参见 here 和 here .

    因此,这个故事的寓意是,如果您有类似的问题,可以检查这些文件属性。

    我们使用的是来自微芯片的Harmony USB驱动程序,所以这可能是该工具的一个细微差别(或者可能只是一个在线例子中的人工制品)。

    您可以使用Windows资源管理器中的文件属性或 > attrib <file> Windows命令提示中的命令。


    要修复:

    窗户 :可以使用 > attrib +a <file> 或者用 > attrib -a <file> .

    如果在Windows主机上使用node.js,则可以使用 the winattr library from NPM 操作这些属性。

    Linux: 你可以用 $ getfattr 和 $ setfattr 设置位(参见 here 和 here )。

    • 注:我链接的答案表示要使用 $ setfattr -h -v 0x00000020 -n system.ntfs_attrib_be <target-file> 但当我试图做同样的手术时,我得到了一个不支持的手术。我最终使用了Java解决方案,但是当我事后检查文件时,它看起来是等效的命令。 $ setfattr -n user.DOSATTRIB -v 0sMHgyMAA= <target-file> . 你的里程可能会有所不同,但我会提供,以防它对任何人都有帮助。

    爪哇: 你也可以 use Java 来自任何系统。

    推荐文章