可能的解决方案

可能的解决方案

我想我的问题非常具体,但我希望可能已经有解决方案了。

我想在虚拟内存中提供一些文件夹,但不改变它们的访问方式,例如虚拟化工具会将文件复制到虚拟内存中并将 IO 操作重定向到虚拟内存中的这些文件。

我有巨大的源文件夹,这些文件夹经常由 maven 重新编译,我想通过使这些源在 RAM 而不是 HDD 中可用来提高整体构建速度。

我熟悉 ImDisk,但我不能通过更改源路径来破坏环境(已经配置了很多工具)。

所以问题是:上述问题有解决方案吗?

问候

答案1

可能的解决方案

假如说:

  • 您已经在分配给的物理内存中创建了一个 RAM 驱动器R:(任何其他字母也可以)。
  • 您想让该文件夹C:\Folder1在 RAM 中可用,以便更快地访问。
  • Folder1存储在本地 NTFS 格式的卷上。

应用更改

  1. 关闭所有可能正在访问的程序Folder1
  2. 重命名Folder1Folder1.zTarget(实际名称并不重要,只要不同即可)。
  3. 复制Folder1.zTarget到 RAM 驱动器 ( R:)。
  4. 创建一个目录连接链接名为Folder1指向R:\Folder1.zTarget

从现在开始,每次您访问时C:\Folder1实际访问的是存储在 RAM 驱动器上的数据(R:\Folder1.zTarget)。

恢复

  1. 关闭所有可能正在访问Folder1(现在是目录连接链接)的程序。
  2. 如果里面的任何文件Folder1被修改了,请将其Folder1.zTarget从 RAM ( R:) 复制到磁盘 ( C:) 以保存更改。
  3. 删除名为 的目录连接链接Folder1
  4. 重命名Folder1.zTargetFolder1

批量自动化

尽管大多数步骤都可以手动执行,但除了命令行界面 ( ) 之外,没有其他内置方法来创建目录连接链接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

相关内容