当前位置:网站首页>WPF 光标初始化的时候 temp 文件夹满了无法创建
WPF 光标初始化的时候 temp 文件夹满了无法创建
2022-08-04 16:54:00 【林德熙】
在 WPF 切换光标的时候,如果是通过本地资源的方法传入 stream 的,需要先复制到临时文件夹里面的文件,然后读取文件指针释放文件。如果此时的 temp 文件夹满了,那么复制文件的时候就无法继续了,于是就无法创建完成光标
最近有老师找我说软件无法使用了,我尝试调试他的电脑,发现任何修改光标的代码就无法继续,因为无法创建光标
大概的修改光标的代码是这样写的,从解决方案里面放一个光标文件,设置为资源通过访问解决方案文件 拿到资源
var uri = new Uri("pack://application:,,,/Text.cur");
var resource = Application.GetResourceStream(uri);
Cursor = new Cursor(resource.Stream);
看到的堆栈如下
在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
在 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)
在 System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
在 System.IO.Directory.CreateDirectory(String path)
在 System.IO.FileHelper.CreateAndOpenTemporaryFile(String& filePath, FileAccess fileAccess, FileOptions fileOptions, String extension, String subFolder)
在 System.Windows.Input.Cursor.LoadFromStream(Stream cursorStream)
在 System.Windows.Input.Cursor..ctor(Stream cursorStream, Boolean scaleWithDpi)
在 System.Windows.Input.Cursor..ctor(Stream cursorStream)
在 FawlalnejajerelaWhallgemcurkear.MainWindow..ctor() 位置 D:\lindexi\程序\FawlalnejajerelaWhallgemcurkear\FawlalnejajerelaWhallgemcurkear\MainWindow.xaml.cs:行号 32
通过读源代码,发现在 LoadFromStream 方法里面是这样写的
private void LoadFromStream(Stream cursorStream)
{
string filePath = null;
try
{
// Generate a temporary file based on the memory stream.
// 从 temp 文件夹创建一个文件
using (FileStream fileStream = FileHelper.CreateAndOpenTemporaryFile(out filePath))
{
// 复制到文件
cursorStream.CopyTo(fileStream);
}
// 从文件里面读取光标
// create a cursor from the temp file
_cursorHandle = UnsafeNativeMethods.LoadImageCursor(IntPtr.Zero, filePath,
NativeMethods.IMAGE_CURSOR,
0, 0,
NativeMethods.LR_DEFAULTCOLOR |
NativeMethods.LR_LOADFROMFILE |
(_scaleWithDpi? NativeMethods.LR_DEFAULTSIZE : 0x0000));
if (_cursorHandle == null || _cursorHandle.IsInvalid)
{
throw new ArgumentException(SR.Get(SRID.Cursor_InvalidStream));
}
}
finally
{
// 尝试删除这个文件,因为光标已经读取了
FileHelper.DeleteTemporaryFile(filePath);
}
}
在 FileHelper.CreateAndOpenTemporaryFile 将会读取到一个 temp 文件夹里面的文件,但是如果这个文件无法访问,那么将不能继续
在我的设备上是很难做到让 temp 文件夹无法访问的,但是可以通过通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径设置一个无法访问的文件夹作为 temp 文件夹
做一个无法访问的文件夹很简单,只需要右击属性安装,去掉用户就可以了
运行代码就会发现提示对路径访问拒绝
System.UnauthorizedAccessException:“对路径“D:\lindexi\无法访问文件夹\WPF”的访问被拒绝。”
可以的解决方法有两个
- 通过环境变量修改 temp 文件夹作为程序自己内部的数据文件夹,这和 UWP 的相同,每个程序都可以有自己独立的 temp 文件夹,可以解决有一些逗比软件会更改整个 temp 文件夹或里面某些文件夹的访问权限或有逗比在 temp 文件夹写入了 65535 个文件让其他程序无法写入文件。从微软官方文档 可以知道 temp 文件夹的文件限制。
- 只对光标的修改将解决方案里面的文件修改为输出的文件,此时将会调用 LoadFromFile 方法,这个方法是读取文件不需要复制文件,相对性能比较快
上面提供的两个方法,第一个方法除了解决光标的问题,还可以解决其他问题。第二个方法可以提升一点性能,同时两个方法可以一起使用
这个问题提交给微软,欢迎小伙伴点击 Full temporary folder will crash cursor initialization
通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径 - walterlv
边栏推荐
- 海报 | 夏季高温,危化品安全风险的注意事项必须get!
- Hubei Mobile HG680-LV_S905L3B_wire brush firmware package
- win11如何退出安全模式
- 代码重构:面向单元测试
- Mobile magic box CM201-1_CW_S905L2_MT7668_wire brush firmware package
- 移动CM101s_MV100_EMMC_M8233_强刷后全分区线刷固件包
- Mobile BesTV_R3300-L_S905L_8189_wire brush firmware package
- 越来越火的图数据库到底能做什么?
- shell脚本详解-------循环语句wuile循环和until循环
- HCIP笔记(6)
猜你喜欢
谷粒商城笔记
电气成套设备行业如何借助ERP系统,解决企业管理难题?
Steady Development | Data and Insights on Mobile Game Players in Western Europe
Minecraft HMCL 使用认证服务器LittleSkin进行登录
mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
【JVM】JVM调优
Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?
跨域传递数据(iframe)
小满nestjs(第一章 介绍nestjs)
浙江移动咪咕MGV2000-K4_ZJ_S905l2_7661_线刷固件包
随机推荐
为什么买域名必须实名认证?这样做什么原因?
xgboost模块param中的一些错误
shell中当basename和dirname无法满足你的需求时你一定要想到的命令
Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
SAP ABAP SteammPunk 蒸汽朋克的最新进展 - 嵌入式蒸汽朋克
机器学习(十六):主成成分分析(PCA)
ctfshow 萌新web1-21
"Distributed cloud best practices" BBS, on August 11, shenzhen
备战9月,美团50道软件测试经典面试题及答案汇总
机器学习(十七):网格搜索(Grid Search)和SVM
转型阵痛期,好未来减亏容易增收难?
【IDEA】idea配置
【商家联盟】云平台—异业联盟,打造线上线下商业相结合的系统
15天升级打怪,成为虚拟时尚创作者
开一个羽毛球馆大概需要多少钱?大约15万左右可以搞定!
从-99打造Sentinel高可用集群限流中间件
刷爆朋友圈!Alibaba出品亿级并发设计速成笔记太香了!
黑龙江移动新魔百盒M411A_2+8_S905L3A_线刷固件包
浙江数码代工M301H 免拆通刷_卡刷固件包(语音OK)
mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器