我想我的问题非常具体,但我希望可能已经有解决方案了。
我想在虚拟内存中提供一些文件夹,但不改变它们的访问方式,例如虚拟化工具会将文件复制到虚拟内存中并将 IO 操作重定向到虚拟内存中的这些文件。
我有巨大的源文件夹,这些文件夹经常由 maven 重新编译,我想通过使这些源在 RAM 而不是 HDD 中可用来提高整体构建速度。
我熟悉 ImDisk,但我不能通过更改源路径来破坏环境(已经配置了很多工具)。
所以问题是:上述问题有解决方案吗?
问候
答案1
可能的解决方案
假如说:
- 您已经在分配给的物理内存中创建了一个 RAM 驱动器
R:
(任何其他字母也可以)。 - 您想让该文件夹
C:\Folder1
在 RAM 中可用,以便更快地访问。 Folder1
存储在本地 NTFS 格式的卷上。
应用更改
- 关闭所有可能正在访问的程序
Folder1
。 - 重命名
Folder1
为Folder1.zTarget
(实际名称并不重要,只要不同即可)。 - 复制
Folder1.zTarget
到 RAM 驱动器 (R:
)。 - 创建一个目录连接链接名为
Folder1
指向R:\Folder1.zTarget
。
从现在开始,每次您访问时C:\Folder1
实际访问的是存储在 RAM 驱动器上的数据(R:\Folder1.zTarget
)。
恢复
- 关闭所有可能正在访问
Folder1
(现在是目录连接链接)的程序。 - 如果里面的任何文件
Folder1
被修改了,请将其Folder1.zTarget
从 RAM (R:
) 复制到磁盘 (C:
) 以保存更改。 - 删除名为 的目录连接链接
Folder1
。 - 重命名
Folder1.zTarget
回Folder1
。
批量自动化
尽管大多数步骤都可以手动执行,但除了命令行界面 ( ) 之外,没有其他内置方法来创建目录连接链接mklink
。在进行此操作时,我们可以通过自动化整个过程来节省时间。
示例脚本
经过短暂的初始化后,脚本将检查是否有任何文件夹的名称包含自定义后缀。然后,它将对变量中设置的每个文件夹应用或还原更改folders
,如上所述 - 除了“关闭所有程序”步骤。
@echo off
set folders="C:\Folder1","C:\Some other\folder"
set suffix=zTarget
set ramdisk=R:
for %%G in (%folders%) do (
dir "%%~dpG" /a:d | find ".%suffix%" >nul
goto :check
)
:check
if "%errorlevel%"=="0" goto :revert
:apply
for %%G in (%folders%) do (
if exist "%%~G\" (
ren "%%~G" "%%~nG.%suffix%"
xcopy "%%~G.%suffix%" "%ramdisk%%%~pnG.%suffix%" /e /i /f /h /r /k /y /j
mklink /j "%%~G" "%ramdisk%%%~pnG.%suffix%"
echo.
))
goto :end
:revert
for %%G in (%folders%) do (
if exist "%%~G.%suffix%\" (
xcopy "%ramdisk%%%~pnG.%suffix%" "%%~G.%suffix%" /e /i /f /h /r /k /y /j
rd "%%~G"
ren "%%~G.%suffix%" "%%~nG"
echo.
))
:end
pause
exit /b