解决C盘空间不足的问题

前言

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

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

https://www.diskanalyzer.com/

注意

除非空间不够并且无法扩容影响使用,否则不建议处理。下面的两种方式都不太完美。

方式1

完全迁移Users文件夹

这种方式按理来说应该完全没问题,但是实际上出现了部分软件配置失效,WPS文档同步也出现了问题。

所以除非完全没空间了,不建议迁移。

开机情况下点击

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

重启后点击高级选项

点击命令提示符

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

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

输入命令

1
2
3
4
5
6
7
8
# 将USer复制到自己的其它盘我是D盘
robocopy "C:\Users" "D:\Users" /E /COPYALL /XJ

# 复制完成之后将原有文件重命名
ren "C:\Users" "Users2"

# 建立软连接
mklink /J "C:\Users" "D:\Users"

重启后可以删除Users2

1
rd /s /q C:\Users2

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

重启3次进入恢复命令行

1
2
3
4
# 删除软连接
rmdir "C:\Users" /S /Q
# 将之前重命名的文件夹变回员User
ren "C:\Users2" "Users"

如果Users2删除了,恢复

1
2
3
4
5
# 删除软连接
rmdir "C:\Users" /S /Q

# 复制文件
robocopy "D:\Users" "C:\Users" /E /COPYALL /XJ

方式2(不推荐)

只更改AppData文件夹

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

手动操作

进入注册表

1
regedit.exe

处理的注册表位置

1
2
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

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

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

AppData

1
%USERPROFILE%\AppData\Roaming

代码操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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:\Users\Administrator\AppData
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(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", pathTbText);
Deal(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", pathTbText);
}
}
}
}

页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<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>