如何使 desktop.ini 在网络位置上工作?

Eri*_*ric 5 desktop network-shares

我有一个应用文件夹图标的简单 desktop.ini 文件。它在本地文件夹中工作得很好。

我希望它在网络位置上工作,因为我们有一个外部硬盘驱动器连接到我们的网络。但是,该desktop.ini文件似乎对所述网络没有影响。

我究竟做错了什么?

Cam*_*tin 5

为什么会发生这种情况

desktop.ini除非它是系统文件,否则Windows 不会读取它(看似只读也有效,但系统文件意味着即使您将非系统隐藏文件设置为可见,它也可以保持隐藏状态)。

为什么你似乎无法修复它

在 Samba 共享(SMB/网络共享协议的 Unix 实现)上,有时即使您例如转到属性并设置“只读”,它也会被忽略而不是设置。这是因为 Samba 默认不存储这些权限——这似乎带来了(可能可以忽略不计的)性能税,因为权限是(AFAIK)设置的,并作为文本数据在备用流中读取(如果你是共享一些基本的 FS,例如FAT)。

如何修复

首先确保 Samba 存储 DOS 样式的权限(如“系统”),通过在您的共享定义中添加以下行:

store dos attributes = yes
Run Code Online (Sandbox Code Playgroud)

也许您可以将此添加到[Global],我已将其添加到特定共享。

此外,有些人会告诉您编辑错误的文件。

  • /usr/share/samba/smb.conf <= 废话
  • /etc/samba/smb.conf <= 正确的文件

重新启动 Samba ( sudo service samba restart),然后快速检查是否可以使用 Windows 资源管理器将文件设为只读,例如,它是否仍然存在。

好的,现在,您可以制作desktop.ini系统/隐藏文件。为此,请使用命令提示符转到它所在的文件夹,然后使用:

attrib +s +h desktop.ini
Run Code Online (Sandbox Code Playgroud)

也可以选择(如果您的图标是相对的并且与我的图标存储在同一文件夹中)。

attrib +s +h folder.ico
Run Code Online (Sandbox Code Playgroud)

最后,您需要将文件夹本身标记为只读(毫无意义且听起来很愚蠢,所以您知道它是合法的)。

attrib +r .
Run Code Online (Sandbox Code Playgroud)

当然,您可以(应该)编写此脚本。使用 MSysGit 的 bash,我在我的整个 NAS 上做了这个:

find . -type f -iname desktop.ini | while read -r i; do
    echo "Processing \"$(basename "${i%/*}")\""
    attrib +s +h "$i"
    attrib +s +h "${i%/*}/folder.ico" # Optional, in case you have these.
    attrib +r "${i%/*}"
done
Run Code Online (Sandbox Code Playgroud)