一个 DSH 会话折腾到最后,几乎都会落在文件上。而手机上没有桌面时代的那套帮手——旁边开个文件浏览器、
另一个窗口挂着 shell——都不存在。DSHBox 的「文件」标签页要在一块屏幕里做完所有事,
而且它面对的文件系统,其实是几棵树叠在一起。这篇讲它的结构和各个对话框的由来。
双视图:工作区与沙盒
文件管理器默认停在工作区视图,根目录是 /root/projects。
这条路径对应安卓侧应用私有存储里的 user-data/,你的会话和项目都住在这棵树里——
整个盒子里唯一完全属于你的树。边界背后的道理,见
《工作区组织:项目、层与数据边界》。
切换到沙盒视图后,看到的是客户机根目录 /:一棵完整的
Debian 13 目录树,Node.js 层挂在 /usr/local,DSH 层挂在
/opt/dshapp/runtime。去那里是为了读配置、看系统,不是为了存东西。
两个视图共用同一套导航:
- 可逐级点击上跳的面包屑路径;
- 列表/网格两种布局,按名称、时间或大小排序;
- 新建文件夹;
- 多选模式——移动或导出二十个文件是一次操作,而不是二十次。
移动文件:护栏先行
选中文件后,先弹出全屏目标选择器:可以在沙盒与工作区之间切换、
走进任意目录、就地新建文件夹,最后确认。
选择器里内置了两道护栏。其一,源文件夹连同它的所有后代目录都会置灰——把一个目录移进它自己的
子树会形成循环,干脆不给这个选项。其二,当移动跨过挂载点——/root/projects
与客户机其余部分是分开挂载的——会先弹出提示,因为这一步不再是廉价的改名,而是一次真正的复制。
冲突的三种策略
目标位置已有同名文件时,冲突对话框给出三个策略,外加“应用到其余项”,
四十个文件的批量移动不会问四十遍。
|
| | 策略 | 会发生什么 |
| 覆盖 | 目标文件被源文件替换 |
| 跳过 | 冲突文件保持原样,其余继续 |
| 自动重命名 | 传入的文件获得一个新的、不冲突的名字 |
底层实现上,同卷移动先尝试 renameTo——一个字节都不用复制;行不通才回退到复制,
并保留权限与时间戳。重命名走的是同一套引擎,所以不跨卷的重命名几乎是瞬间完成的。
导入与导出
导入把文件从安卓共享存储带进来,支持多选。压缩包可以在导入时顺带解压,
每个冲突条目单独决策,而不是一刀切;全程可取消,结束有汇总。两个细节值得知道:
ZIP 里的中文文件名会被正确解码;加密的 ZIP 会被直接拒收,而不是解到一半留下残局。
导出是反方向:选中任意多个文件,通过系统文件选择器(SAF)送到某个目录,
或者先打包成一个 ZIP。以此为基础的备份策略,见
《DSHBox 把数据存在哪,怎么备份》。
全局搜索:文件名与内容
全局搜索同时覆盖沙盒与工作区,而且搜两样东西:文件名和文件内容。每条结果都带
命中片段,一眼能分清 scripts/common.sh 是因为名字被搜到,还是因为里面的某一行。
在手机上,这个差别很省时间。
风险标签与写入确认
沙盒里不是每个目录都值得同样的信任。系统目录、node 层、DSH 层和 .dsh
在界面上按级别标注了风险,写入它们的操作会先经过一道强确认。
经验法则。把 /root/projects 之外的一切当成“可以读的机器”,
而不是“可以写的仓库”。这些层是可替换的,更新时会被整体换掉——
《工作区组织》解释了为什么这是特性。
如果你更想知道怎么“打开”而不是“移动”文件,下一篇是
《任何文件都有界面》。