文件属性修改器(C#)

博主在长时间未编程后,为满足工作需求,利用3个晚上的时间编写了一个文件属性修改器,旨在锻炼技能并增强功能。程序中融入了窗体事件捕获、绘图和资源管理等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         好长时间没有学习编程了,但心中一直挂念着程序,怀念过去曾经的时光。 
         最近工作需要,需要修改一些文件的属性,看到网上有一个,研究一番,觉得还是自己写一个,一来练练手过过瘾,二来也增加一些功能,于是花费了3个晚上写了这个文件属性修改器,(汗,用这么长时间)。
         程序中用到了以前不曾使用的三项技术:窗体之间事件捕获、画图和资源管理。
         下面是程序代码,资源管理文件无法上传。

 

//Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Resources;
using System.Reflection;

namespace FileAttrib
{
    
/// <summary>
    
/// 设置文件属性
    
/// </summary>
    public partial class Form1 : Form
    {
        
private Form2 form2;

        
//button4被单击的次数,用来判断当前应显示哪个文件的属性
        int buttonClickCount = 0;
        
private ResourceManager getLocalResource = new ResourceManager("FileAttrib.Properties.Resources", Assembly.GetEntryAssembly());

        
public Form1()
        {
            
//设置图标
            this.Icon =(Icon )getLocalResource.GetObject("propertiesORoptions");
            InitializeComponent();
        }

        
private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        
/// <summary>
        
/// 选择文件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            
int fileNameCount=0;
            
string[] fileNames;

            
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                fileNames 
= this.openFileDialog1.FileNames;
                fileNameCount 
= fileNames.Length;

                
if (fileNameCount == 1)
                {
                    
this.textBox1.Text = fileNames[0];
                    button4.Visible 
= false;

                    
//取文件属性
                    loadFileAttrib(fileNames[0]);
                }
                
else
                {
                    
//选择文件多于一个时,打开第二个窗口,以放置文件
                    if (form2 == null || form2.IsDisposed)
                    {
                        form2 
= new Form2();
                        form2.Width 
= base.Width;
                        form2.Left 
= base.Left;
                        form2.Top 
= base.Top - form2.Height;
                        
//form2成为form1的附属窗体
                        this.AddOwnedForm(form2);
                        form2.Show();
                    }

                    
//form2移动、修改大小的事件通知,这样两个窗口的相对位置可以保持不动
                    form2.moveHaveRaise += new Form2.formMoveHandler(this.Form2_Move);
                    
                    
//form2的ListViewItem选择的事件通知
                    form2.itemSelectChange += new Form2.formMoveHandler(this.itemSelect_Change);                    
                }

                
//将选择的文件放到form2中
                if (form2 != null)
                {
                    form2.addListViewItems 
= fileNames;
                }
            }
        }

        
/// <summary>
        
/// 修改文件属性
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            
char[] ss = { '|' };
            
int fileNumber = textBox1.Text.Split(ss).Length;
            
if (fileNumber == 1)
            {
                writeFileAttrib(textBox1.Text);
            }
            
else
            {
                
if (MessageBox.Show("你选择了"+fileNumber.ToString()+"个文件,这些文件的属性都将被修改,确定吗?","修改确认",MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    
foreach (string fileName in textBox1.Text.Split(ss))
                    {
                        writeFileAttrib(fileName);
                    }
                }
            }
        }

        
/// <summary>
        
/// 点击该按钮,顺序显示textBox1中个文件的属性,同时form2.SelectedItems的当前项被用红色的矩形框标示出来
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            
char[] ss = { '|' };
            
int len, i = 1;
            len 
= textBox1.Text.Split(ss).Length;
            buttonClickCount
++;
            
string[] fileNames = textBox1.Text.Split(ss);
            
foreach (string fileName in fileNames)
            {
                
if (i == buttonClickCount+1)
                {
                    
//显示属性
                    loadFileAttrib(fileName);
                    
//文件名传递到form2,用来查找相对应的项。
                    form2.flashItem = fileName;
                    
if (buttonClickCount+1 == len)
                    {
                        buttonClickCount
=-1;
                    }
                    
break;
                }
                i
++;
            }
        }

        
/// <summary>
        
/// 窗口移动,form2跟着移动
        
/// 两个form2.moveHaveRaise事件是为了防止移动事件重复出现导致图像闪烁
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form1_Move(object sender, EventArgs e)
        {
            
if (form2!= null)
            {
                form2.moveHaveRaise 
-= new Form2.formMoveHandler(this.Form2_Move);
                form2.Left 
= base.Left;
                form2.Top 
= base.Top - form2.Height;
                form2.moveHaveRaise 
+= new Form2.formMoveHandler(this.Form2_Move);
            }
        }

        
/// <summary>
        
/// form2窗口移动,form1跟着移动
        
/// 两个this.Move事件是为了防止移动事件重复出现导致图像闪烁
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form2_Move(object sender, EventArgs e)
        {
            
if (form2 != null)
            {
                
this.Move -= new System.EventHandler(this.Form1_Move);
                
this.Left = form2.Left;
                
this.Top = form2.Top + form2.Height;
                
this.Move += new System.EventHandler(this.Form1_Move);
            }
        }

        
/// <summary>
        
/// form2的ListViewItem选择的事件处理程序
        
/// 选择ListViewItem项,相应的将文件名写到textBox1中,文件名之间用"|"分割
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void itemSelect_Change(object sender, EventArgs e)
        {
            textBox1.Text 
= "";

            
//SelectedItemArray是SelectedItems的集合数组
            foreach (ListViewItem item in form2.SelectedItemArray)
            {
                textBox1.Text 
+= item.SubItems[1].Text + "|";
            }

            
char[] ss = {'|'};
            textBox1.Text 
= textBox1.Text.TrimEnd(ss);//去掉末尾的"|"

            
if (textBox1.Text.Split(ss).Length == 1)
            {
                loadFileAttrib(textBox1.Text);
                button4.Visible 
= false;
            }
            
else
            {
                button4.Visible 
= true;
                buttonClickCount 
= 0;
                loadFileAttrib(textBox1.Text.Split(ss)[
0]);
            }
        }

        
/// <summary>
        
/// 取文件属性
        
/// </summary>
        
/// <param name="fileName"></param>
        private void loadFileAttrib(string fileName)
        {
            
this.checkBox1.Checked = false;
            
this.checkBox2.Checked = false;
            
this.checkBox3.Checked = false;
            
this.checkBox4.Checked = false;
            
this.checkBox5.Checked = false;
            
if (File.Exists(fileName))
            {
                
this.dateTimePicker1.Text = File.GetCreationTime(fileName).ToString();
                
this.dateTimePicker2.Text = File.GetLastWriteTime(fileName).ToString();
                
this.dateTimePicker3.Text = File.GetLastAccessTime(fileName).ToString();
                
string text1 = File.GetAttributes(fileName).ToString();
                
if (text1.LastIndexOf("ReadOnly"!= -1)
                {
                    
this.checkBox1.Checked = true;
                }
                
if (text1.LastIndexOf("System"!= -1)
                {
                    
this.checkBox2.Checked = true;
                }
                
if (text1.LastIndexOf("Hidden"!= -1)
                {
                    
this.checkBox3.Checked = true;
                }
                
if (text1.LastIndexOf("Archive"!= -1)
                {
                    
this.checkBox4.Checked = true;
                }
                
if (text1.LastIndexOf("Temporary"!= -1)
                {
                    
this.checkBox5.Checked = true;
                }

                FileInfo fi 
= new FileInfo(fileName);
                label6.Text 
= fi.Length.ToString("#,#"+ "字节";
                fi 
= null;
            }
        }

        
/// <summary>
        
/// 写文件属性
        
/// </summary>
        
/// <param name="fileName"></param>
        private void writeFileAttrib(string fileName)
        {
            
if (File.Exists(fileName))
            {
                File.SetAttributes(fileName, FileAttributes.Normal);
                FileAttributes attributes1 
= File.GetAttributes(fileName);
                
if (this.checkBox1.Checked)
                {
                    File.SetAttributes(fileName, FileAttributes.ReadOnly);
                }
                
if (this.checkBox2.Checked)
                {
                    File.SetAttributes(fileName, attributes1 
| FileAttributes.System);
                }
                
if (this.checkBox3.Checked)
                {
                    File.SetAttributes(fileName, attributes1 
| FileAttributes.Hidden);
                }
                
if (this.checkBox4.Checked)
                {
                    File.SetAttributes(fileName, attributes1 
| FileAttributes.Archive);
                }
                
if (this.checkBox1.Checked)
                {
                    File.SetAttributes(fileName, attributes1 
| FileAttributes.Temporary);
                }
                File.SetCreationTime(fileName, 
this.dateTimePicker1.Value);
                File.SetLastWriteTime(fileName, 
this.dateTimePicker2.Value);
                File.SetLastAccessTime(fileName, 
this.dateTimePicker3.Value);

                
char[] ss = { '|' };
                
int fileNumber = textBox1.Text.Split(ss).Length;
                
if (fileNumber == 1 || fileName == textBox1.Text.Split(ss)[fileNumber-1])
                {
                    MessageBox.Show(getLocalResource.GetString(
"setAttribSuccess"), getLocalResource.GetString("infoTip"), MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
            }
            
else
            {
                
string fileNotExistMessage = getLocalResource.GetString("fileNotExist");
                MessageBox.Show(fileNotExistMessage 
+ ":" + fileName);
            }
        }

        
private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            System.Diagnostics.Process.Start(
"mailto:kfqcharge@126.com");
        }
    }
}

//Form2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace FileAttrib
{
    
public partial class Form2 : Form
    {
        
//定义事件委托
        public delegate void formMoveHandler(object sender, EventArgs e);
        
//定义事件,1、窗体移动或大小改变时间;2、ListView项选择事件
        public event formMoveHandler moveHaveRaise,itemSelectChange;

        
string[] addFileNames;
        
int fileNumber = 0;

        
public Form2()
        {
            InitializeComponent();
        }

        
/// <summary>
        
/// 属性:增加文件,调用addItems
        
/// </summary>
        public string[] addListViewItems
        {
            
set 
            {
                addFileNames 
= value;
                addItems(addFileNames);
            }
        }

        
/// <summary>
        
/// 增加文件,调用addItem
        
/// </summary>
        private void addItems(string[] fileNames)
        {
            
foreach (string fileName in fileNames)
            {
                addItem(fileName);
            }
        }
        
        
/// <summary>
        
/// 增加文件
        
/// </summary>
        
/// <param name="fileName"></param>
        private void addItem(string fileName)
        {
            fileNumber
++;

            ListViewItem additem 
= new ListViewItem(fileNumber.ToString());
            additem.SubItems.Add(fileName);
            listView1.Items.Add(additem);
            listView1.Columns[
1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            
//是否显示button1
            buttonVisible();
        }

        
/// <summary>
        
/// 清除所有项
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void clearAll_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            fileNumber 
= 0;
            buttonVisible();
        }

        
/// <summary>
        
/// 清除选择项
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void deleteSelected_Click(object sender, EventArgs e)
        {
            
foreach (ListViewItem item in listView1.SelectedItems)
            {
                item.Remove();
            }
            buttonVisible();
        }

        
/// <summary>
        
/// 窗口移动,触发moveHaveRaise事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form2_Move(object sender, EventArgs e)
        {
            
if (moveHaveRaise != null)
            {
                moveHaveRaise(
this, e);
            }
        }

        
/// <summary>
        
/// 窗口大小改变,触发moveHaveRaise事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form2_ResizeEnd(object sender, EventArgs e)
        {
            
if (moveHaveRaise != null)
            {
                moveHaveRaise(
this, e);
            }

            buttonVisible();
        }

        
/// <summary>
        
/// 选择想改变,触发itemSelectChange事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            
if (itemSelectChange != null)
            {
                itemSelectChange(
this,e);
            }
        }

        
/// <summary>
        
/// 属性:返回当前所有选择项
        
/// </summary>
        public ListViewItem[] SelectedItemArray
        {
            
get
            {
                ListViewItem[] selectedItemNames 
= new ListViewItem[listView1.SelectedItems.Count];
                listView1.SelectedItems.CopyTo(selectedItemNames, 
0);
                
return selectedItemNames;
            }
        }

        
/// <summary>
        
/// 属性:用GDI+为选择项画一个红色矩形,调用下面的Flash
        
/// </summary>
        public string flashItem
        {
            
set
            {
                
string flashFile = value;
                Flash(flashFile);
            }
        }

        
/// <summary>
        
/// 用GDI+为选择项画一个红色矩形,调用下面的drawItem
        
/// </summary>
        
/// <param name="flashFile"></param>
        private void Flash(string flashFile)
        {
            listView1.Refresh();

            ListViewItem foundItem 
= listView1.FindItemWithText(flashFile, true, listView1.SelectedIndices[0]);

            drawItem(foundItem);
        }

        
/// <summary>
        
/// 用GDI+为选择项画一个红色矩形
        
/// </summary>
        
/// <param name="foundItem"></param>
        private void drawItem(ListViewItem currentItem)
        {
            
if (currentItem != null)
            {
                
//创建画笔颜色
                Pen redPen = new Pen(Color.Red);                
                
//创建绘画图面
                Graphics itemGraphics = listView1.CreateGraphics();
                
//创建矩形
                Rectangle rect = currentItem.Bounds;
                currentItem.Bounds.Intersect(rect);
                
//在屏幕上画矩形
                itemGraphics.DrawRectangle(redPen, rect);
                
//释放资源
                redPen.Dispose();
                itemGraphics.Dispose();
            }
        }

        
/// <summary>
        
/// 窗口关闭前,将主窗口textBox1清空
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            listView1.Items.Clear();
            
if (itemSelectChange != null)
            {
                itemSelectChange(
this, e);
            }
        }

        
/// <summary>
        
/// 将窗口宽度在listView1实际宽度和主窗口宽度之间切换
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            
int width1=listView1.Columns[0].Width + listView1.Columns[1].Width;

            
if (width1 > this.Width)
            {
                
this.Width = width1 + 30;
            }
            
else
            {
                
this.Width = 348;
            }

            button1.Left 
= this.Width - 27;
            listView1.Select();
        }

        
/// <summary>
        
/// 根据窗体宽度和listView1实际宽度,设置button1是否可见
        
/// </summary>
        private void buttonVisible()
        {
            
int width1 = listView1.Columns[0].Width + listView1.Columns[1].Width + 30;

            
if (width1 > this.Width)
            {
                button1.Visible 
= true;
            }
            
else
            {
                button1.Visible 
= false;
            }

            button1.Left 
= this.Width - 27;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值