电脑上AppData数据迁移(解决C盘空间不足的问题)

2023-03-24 14:54:46 浏览数 (2)

前言

电脑使用时间一长,C盘就会空间不够用,其中大部分都是AppData文件夹占用的,我们就可以迁移

我们可以使用WizTree这个软件来查看磁盘空间占用情况。

https://www.diskanalyzer.com/

方式1(推荐)

完全迁移Users文件夹

开机情况下点击

更新和安全 => 恢复 => 高级启动

重启后点击高级选项

点击命令提示符

如果没有可以使用PE进行操作

PE中自带的cmd没有robocopy命令,可以使用C:WindowsSystem32下的cmd.exe

输入命令

代码语言:javascript复制
# 将USer复制到自己的其它盘我是D盘
robocopy "C:Users" "D:Users" /E /COPYALL /XJ
 
# 复制完成之后将原有文件重命名
ren "C:Users" "Users2"
 
# 建立软连接
mklink /J "C:Users" "D:Users"

重启后可以删除Users2

代码语言:javascript复制
rd /s /q C:Users2

注:如果重启不了,那么通过以下方式恢复

重启3次进入恢复命令行

代码语言:javascript复制
# 删除软连接
rmdir "C:Users" /S /Q
# 将之前重命名的文件夹变回员User
ren "C:Users2" "Users"

方式2

只更改AppData文件夹

这种方式会导致部分软件无法运行。

进入注册表

代码语言:javascript复制
regedit.exe

处理的注册表位置

代码语言:javascript复制
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionExplorerShell Folders
HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionExplorerUser Shell Folders

把其中和AppData相关的键值改为新位置即可。

这种方法并不能完全替换完。

AppData

代码语言:javascript复制
%USERPROFILE%AppDataRoaming

使用代码实现

代码语言:javascript复制
using System;
using System.IO;
using System.Windows;

using Microsoft.Win32;

namespace appdata_migration
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            PathOriginTb.Text = GetPathOrigin();
            PathTb.Text = @"D:AppData";
        }

        //C:UsersAdministratorAppData
        private static string GetPathOrigin()
        {
            
            return Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).Replace(@"Roaming", ""); 
        }


        /// <summary>
        /// 修改注册表
        /// </summary>
        /// <param name="pPath"></param>
        /// <param name="pathNew"></param>
        private void Deal(string pPath, string pathNew)
        {
            var mreg = Registry.CurrentUser;
            mreg = mreg.OpenSubKey(pPath, true);

            if (mreg == null) return;
            var valueNames = mreg.GetValueNames();
            foreach (var valueName in valueNames)
            {
                var value = mreg.GetValue(valueName).ToString();

                if (!value.Contains("AppData")) continue;
                var preStr = value.Substring(0,
                    value.IndexOf("AppData", StringComparison.Ordinal)   "AppData".Length
                );

                var newStr = value.Replace(preStr, pathNew);
                Console.WriteLine(valueName);
                Console.WriteLine(newStr);
                mreg.SetValue(valueName, newStr);
            }
        }

        private void DealClick(object sender, RoutedEventArgs e)
        {
            var pathTbText = PathTb.Text;
            if (!Directory.Exists(pathTbText))
            {
                MessageBox.Show("文件夹不存在");
            }
            else
            {
                Deal(@"SOFTWAREMicrosoftWindowsCurrentVersionExplorerShell Folders", pathTbText);
                Deal(@"SOFTWAREMicrosoftWindowsCurrentVersionExplorerUser Shell Folders", pathTbText);
            }
        }
    }
}

页面

代码语言:javascript复制
<Window
    x:Class="appdata_migration.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:appdata_migration"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="AppData迁移"
    Width="420"
    Height="160"
    mc:Ignorable="d">
    <Grid>
        <Grid Margin="10,10,10,10" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="100" />
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition Height="10" />
                <RowDefinition Height="30" />

                <RowDefinition Height="10" />
                <RowDefinition Height="30" />
            </Grid.RowDefinitions>

            <TextBlock
                Grid.Row="0"
                Grid.Column="0"
                VerticalAlignment="Center"
                FontSize="16"
                Text="源路径" />
            <TextBox
                Name="PathOriginTb"
                Grid.Row="0"
                Grid.Column="1"
                Grid.ColumnSpan="2"
                Margin="10,0,0,0"
                VerticalContentAlignment="Center" />

            <TextBlock
                Grid.Row="2"
                Grid.Column="0"
                VerticalAlignment="Center"
                FontSize="16"
                Text="新路径" />
            <TextBox
                Name="PathTb"
                Grid.Row="2"
                Grid.Column="1"
                Margin="10,0,0,0"
                VerticalContentAlignment="Center" />
            <Button
                Grid.Row="2"
                Grid.Column="2"
                Margin="10,0,0,0"
                Background="DodgerBlue"
                BorderThickness="0"
                Click="DealClick"
                Cursor="Hand"
                FontSize="16"
                Foreground="White">
                开始处理
            </Button>

            <TextBlock
                Name="ResultTb"
                Grid.Row="4"
                Grid.Column="0"
                Grid.ColumnSpan="3"
                HorizontalAlignment="Center"
                FontSize="14"
                Foreground="#666666"
                Text="请手都复制AppData文件后再执行"
                TextWrapping="Wrap" />
        </Grid>
    </Grid>
</Window>

0 人点赞