title author date CreateTime categories
WPF 光标初始化的时候 temp 文件夹满了无法创建
lindexi
2019-05-16 19:16:27 +0800
2019-5-16 16:2:30 +0800
WPF

在 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”的访问被拒绝。”

可以的解决方法有两个

  1. 通过环境变量修改 temp 文件夹作为程序自己内部的数据文件夹,这和 UWP 的相同,每个程序都可以有自己独立的 temp 文件夹,可以解决有一些逗比软件会更改整个 temp 文件夹或里面某些文件夹的访问权限或有逗比在 temp 文件夹写入了 65535 个文件让其他程序无法写入文件。从微软官方文档 可以知道 temp 文件夹的文件限制。
  2. 只对光标的修改将解决方案里面的文件修改为输出的文件,此时将会调用 LoadFromFile 方法,这个方法是读取文件不需要复制文件,相对性能比较快

上面提供的两个方法,第一个方法除了解决光标的问题,还可以解决其他问题。第二个方法可以提升一点性能,同时两个方法可以一起使用

这个问题提交给微软,欢迎小伙伴点击 Full temporary folder will crash cursor initialization 帮我点赞

通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径 - walterlv

GetTempFileNameA function (fileapi.h)

Path.GetTempFileName Method (System.IO)

2019-5-16-WPF-光标初始化的时候-temp-文件夹满了无法创建的更多相关文章

  1. WPF实例,以getFiles()获取文件夹,treeview的应用

    读取电脑硬盘根目录添加到TreeView控件 foreach (DriveInfo item in System.IO.DriveInfo.GetDrives()) { if(item.ToStrin ...

  2. WPF上传图片到服务器文件夹

    1.前端用ListBox加载显示多张图片 1 <ListBox Name="lbHeadImages" Grid.Row="1" ScrollViewer ...

  3. Git学习(一):初始化仓库、添加文件、版本回退

    目录 Git学习(一):初始化.添加文件.版本回退 初始化一个仓库 添加文件到Git仓库 版本回退 Git学习(一):初始化.添加文件.版本回退 初始化一个仓库 本文使用的命令行工具为cmder,部分 ...

  4. 2019.9.16 linux安装软件lamp

    2019/9/16 Linux软件安装 方式:yum/rpm/源码安装 yum安装: yum 是通过分析RPM的包头数据后,根据各软件的相关性制作出属性相对应的解决方案,然后可以自动处理软件的相依属性 ...

  5. Visual Studio 2019 升级16.8之后(升级.Net 5),RazorTagHelper任务意外失败

    vs2019升级16.8后,原来.net core 3.1的项目编译时出现了莫名其妙的错误: 1. "RazorTagHelper"任务意外失败 2. ...provide a v ...

  6. WPF:自定义Metro样式文件夹选择对话框FolderBrowserDialog

    1.前言 WPF并没有文件选择对话框,要用也就只有使用Winform版的控件.至今我也没有寻找到一个WPF版本的文件选择对话框. 可能是我眼浊,如果各位知道有功能比较健全的WPF版文件选择对话框.文件 ...

  7. WPF调用C++生成的dll文件(示例)

    注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...

  8. 在WPF中使用文件夹选择对话框

    开发中有时会想实现"选择某个文件夹"的效果: 在WPF中,使用Microsoft.Win32.OpenFileDialog只能选择文件,FolderBrowserDialog只能用 ...

  9. C# C/S WPF 远程操作服务器上面的文件

    作的时候用的是WPF,需要做一个上传附件的功能,服务器上有一个文件夹,附件都上传到里面,只知道URL路径. 文件夹是在服务器上的IIS里面(就比如说你发布一个网站,把文件夹建在网站下面,当然这个网站啥 ...

随机推荐

  1. 程序性能优化之APK大小优化(六)下篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从微信资源混淆AndResGuard原理来介绍AP ...

  2. 更换nginx默认端口以及配置文件位置

    前言 近段时间在准备毕业设计的前期准备,基本确定了前后端分离的架构,于是就需要用到了nginx. 在之前nginx是放在docker上,所以没有端口更改跟配置文件配置的烦恼.但是现在是直接放在服务器上 ...

  3. Neo4j高级应用技术专题系列 - APOC存储过程库-【1】概述

    Neo4j高级应用技术专题系列 - APOC存储过程库-[1]概述 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://bl ...

  4. C# FTP操作代码实现

    C#  FTP 实现方式,废话不多说,直接上代码 public class FtpClient { #region 构造函数 /// <summary> /// 创建FTP工具 /// & ...

  5. Java 多态基础

    多态的定义 程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在运行期间才确定. 或者是同一个行为具有多个不同表现形式或形态的能力. 多态的体现 在玩LOL时,W ...

  6. 说一下HTML5与传统HTML的区别

    1.首先说一下什么是HTML5 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HT ...

  7. Linux 临时和永久关闭 Selinux

    查看当前 Selinux 状态:getenforce 临时关闭 Selinux:setenforce 0 永久关闭 Selinux: vim /etc/sysconfig/selinux 将 SELI ...

  8. Python 直接赋值、浅拷贝和深度拷贝区别

    Python 直接赋值.浅拷贝和深度拷贝区别 转自https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-de ...

  9. 【hihocoder 1554】最短的 Nore0061

    [链接]http://hihocoder.com/problemset/problem/1554 [题意] 中文题 [题解] DP; 设f[i][j][k]表示前i个字符,第一个串已经得到了前j个字符 ...

  10. 【Dart学习】-- Dart之泛型

    一,概述  Dart是一种可选的类型语言.Dart中的集合默认是异构的.换句话说,单个Dart集合可以托管各种类型的值.但是,可以使Dart集合保持同质值.泛型的概念可以用来实现同样的目的. 泛型的使 ...