前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WPF 制作一个占用文件的测试工具

WPF 制作一个占用文件的测试工具

作者头像
林德熙
发布2021-11-15 16:07:46
3670
发布2021-11-15 16:07:46
举报
文章被收录于专栏:林德熙的博客林德熙的博客

我在开发软件进行测试时,需要测试拖入的文件被占用时软件的行为,于是就做了一个文件占用工具,此工具可以将某个文件进行占用,以及获取某个文件被哪个进程占用

先给大家看一下效果:

以上是拖入文件到灰色部分,将会让此文件被占用。点击释放按钮即可释放对此文件的占用

如果拖入的文件已被占用了,将会显示占用文件的进程

此工具的制作十分简单,先看看界面部分,代码如下

代码语言:javascript
复制
<Window x:Class="TakeUpFile.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TakeUpFile"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid Background="Gray" AllowDrop="true" Drop="Grid_Drop">
            
        </Grid>
        <Grid Grid.Row="1" Margin="10,10,10,10">
            <TextBlock x:Name="TracerTextBlock" Margin="10,10,10,10" />
            <Button HorizontalAlignment="Right" Margin="10,10,10,10" Click="Button_Click">释放</Button>
        </Grid>
    </Grid>
</Window>

在 Grid_Drop 里面,将使用 FileStream 打开传入的文件,打开方式的设置不共享,也就是占用文件。如果打开失败,使用 WPF 获取是哪个进程占用了文件 的方法拿到占用文件进程

代码语言:javascript
复制
        private void Grid_Drop(object sender, DragEventArgs e)
        {
            Release();

            var fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
            if (fileList is not null)
            {
                var file = fileList.FirstOrDefault();
                if (file != null)
                {
                    if (File.Exists(file))
                    {
                        try
                        {
                            CurrentFileStream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                        }
                        catch (IOException ioException)
                        {
                            if (ioException.HResult == unchecked((int)0x80070020))
                            {
                                var processList = FileUtil.WhoIsLocking(file);
                                if (processList != null)
                                {
                                    var message = $"文件{file}被程序占用中:";
                                    foreach (var item in processList)
                                    {
                                        message += $"{item.ProcessName}({item.Id});";
                                    }

                                    TracerTextBlock.Text = message;
                                    return;
                                }
                            }
                        }

                        TracerTextBlock.Text = $"锁定 {file}";
                    }
                }
            }
        }

上面的 Release 方法是释放占用

代码语言:javascript
复制
        private void Release()
        {
            try
            {
                CurrentFileStream?.Dispose();
            }
            catch
            {
                // 忽略
            }
        }

本文代码放在 githubgitee 欢迎访问


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E5%8D%A0%E7%94%A8%E6%96%87%E4%BB%B6%E7%9A%84%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档