在教程中,我會把需要特別注意的東東寫出來,所以估計要寫的內容還是比較多,但由於最近幾天比較忙哈,我可能會分幾天時間把教程補充完整,謝謝!
本例,完成的東東是一個文件管理器,Windows資源管理器山寨版。算是一個很簡單的教程吧,不涉及數據庫,只是做一個winform程序,如果要做成web形式的,基本相同,只需要作小部分地修改。當然,這個文件管理器還存在很多不足,有待於功能和界面上的完善。本例主要是提供給那些和我一樣是菜菜的愛好者進行學習,高手呢,可以飄過,當然,能留下您寶貴的指導是最好的,嘿嘿。
下面詳細介紹這個小程序能實現的功能:
1.包括TXET文本的新建、復制、粘貼、刪除和撤銷等文件操作。
2.對文本字體的操作:粗體、下劃線和斜體。
3.包括文本夾的新建、復制、粘貼、刪除等文件夾操作。
4.五種查看方式:列表、小圖標、大圖標、標題和詳細。
軟件界面
文件管理器主界面
進入驅動器D盤後的界面
新建文件界面
新建文件夾界面
文本文檔界面
System.IO
System.IO命名空間很重要,它包含了許多的類,以便讓托管應用程序可以通過同步或異步方式提供文本I/O以及其他形式的輸入和輸出方式,從而操作文件系統或流的輸入和輸出操作。System.IO的命名空間相當龐大,在本例中,主要用到以下幾個方面:
1.File類:它提供了打開,創建,復制,移動,重命名文件以及讀寫文件屬性的靜態方法.
2.Directory類:它為目錄提供編程接口,使應用程序可以通過簡單的方法來創建,刪除目錄.
3.FileStream類:它允許將文件作為流訪問,實現標准的輸出,輸入操作,可隨機的訪問文件內容.
4.StreamReader與StreamWriter類:它們支持對文本的讀寫操作,讓應用程序可以訪問文件或信息流.
下面,簡要說一下在例子中用到的幾個控件及它們的屬性。
ListView
通過ListView控件,可以在標准視圖對話框中進行各種操作(查看,打開文件等)。本例中,主要用到以下功能:
1.View: a LargeIcon:所有選項都在其旁邊顯示一個大圖標和一個標簽。
b SmallIcon:所有選項都在其旁邊顯示一個小圖標和一個標簽。
c List:只顯示一列,該列可以包含一個圖標和一個標簽。
d Details:可以顯示任意數量的列,只有第一列可以包含圖像。
2.SelectedItems:這個屬性包含了選中選項的集合。
3.MultiSelect:這個屬性設置為true,用戶可以選擇多個選項。
4.LargeImageList:這個屬性包含ImageList,其中ImageList包含ListView中要使用的圖像。當View屬性為LargeIcon時,可以使用圖像。
5.SmallImageList:這個屬性包含ImageList,其中ImageList包含ListView中要使用的圖像。當View屬性為SmallIcon時,可以使用圖像。
ImageList
ImageList 控件包含 ListImage 對象的集合,該集合中的每個對象都可以通過其索引或關鍵字被引用。ImageList 控件不能獨立使用,只是作為一個便於向其它控件提供圖象的資料中心。
語法:ImageList
ImageList 控件的作用象圖像的儲藏室,同時,它需要第二個控件顯示所儲存的圖像。第二個控件可以是任何能顯示圖像 Picture 對象的控件,也可以是特別設計的、用於綁定 ImageList 控件的 Windows 通用控件之一。這些控件包括ListView、ToolBar、TabStrip、Header、ImageCombo、和 TreeView 控件。為了與這些控件一同使用 ImageList,必須通過一個適當的屬性將特定的 ImageList控件綁定到第二個控件。對於 ListView 控件,必須設置其 Icons 和 SmallIcons 屬性為 ImageList 控件。對於 TreeView、TabStrip、ImageCombo、和 Toolbar 控件,必須設置 ImageList 屬性為 ImageList 控件。
在設計時,可以用“ImageList 控件屬性”對話框的“圖像”選項卡來添加圖象。在運行時,可以用 Add 方法給 ListImages 集合添加圖象。
ContextMenuStrip
ContextMenuStrip 控件提供了與某個控件關聯的快捷菜單。也就是說通過這個控件可以方便的實現在別的控件上彈出右鍵快捷菜單。
例子:
1、先添加一個ContextMenuStrip 控件到Form上
2、設置目標控件(如窗體、文本框等)的ContextMenuStrip屬性,指向你剛才添加的ContextMenuStrip 控件。這樣就實現了兩者的關聯。
3、動態將一些菜單項添加到 ContextMenuStrip 控件中,如:
//上下文菜單項
ContextMenuStrip1.Items.Add(msEditNew);
ContextMenuStrip1.Items.Add(msEditBar1);
ContextMenuStrip1.Items.Add(msEditCut);
ContextMenuStrip1.Items.Add(msEditPaste);
ContextMenuStrip1.Items.Add(msEditDelete);
ContextMenuStrip1.Items.Add(msEditBar2);
這樣就OK了,你在目標控件上按右鍵時將彈出快捷菜單。
通過上面的介紹,大家應該能明白本例中要實現的效果,需要用到的控件及重要屬性等,下面,就可以切入正題,如何通過編程,實現我們上面提到的功能。呵呵,再提一點,也是比較重要的:C#是一種面向對象的編程語言,因此,在編程之前我們就要有“面向對象編程”的思想,在編程的過程中貫徹這樣的思想,
同時,這也是符合目前公司裡的編程思想。還有一點,盡量做到代碼的規范,可以為以後再次開發或別人閱讀我們程序起到簡便明了的作用。
主要有兩個類:Folder.cs和Txt.cs,分別是對文件和文本的相關操作。類裡的方法,我都做了詳盡的注釋,如果還有什麼不明白,可以聯系我。
Folder.cs
CODE:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FileManager.Class
{
public class Folder
{
/// <summary>
/// 新建文件夾
/// </summary>
/// <param name="filename">文件夾名</param>
/// <param name="path">文件夾路徑</param>
public static void NewFolder(string foldername, string path)
{
foldername.Trim();
//如果輸入信息為空,提示
if (foldername == "")
{
MessageBox.Show("目錄名不能為空");
return;
}
else
{
string FullName = path + "\\" + foldername;
//如果該文件以及存在
if (Directory.Exists(FullName))
{
MessageBox.Show("該目錄已經存在,請重命名");
return;
}
else
{
//新建文件夾
Directory.CreateDirectory(FullName);
}
}
}
/// <summary>
/// 新建文件夾(Enter鍵觸發)
/// </summary>
/// <param name="filename">文件夾名</param>
/// <param name="path">文件夾路徑</param>
public static void Enter(string foldername, string path)
{
foldername.Trim();
if (foldername == "")
{
MessageBox.Show("目錄名不能為空!");
return;
}
else if (Directory.Exists(path + "\\" + foldername))
{
MessageBox.Show("該目錄以及存在,請重新命名");
return;
}
else
{
Directory.CreateDirectory(path + "\\" + foldername);
}
}
/// <summary>
/// //獲取文件夾名,
截取“\”
/// </summary>
/// <param name="DirectoryPath">文件夾完整路徑</param>
/// <returns></returns>
internal static int DirectoryName(string DirectoryPath)
{
int j = 0;
char[] c = DirectoryPath.ToCharArray();
for (int i = c.Length - 1; i >= 0; i--)//從後面截取
{
j = i;
if (c[i].ToString() == "\\")
{
break;//遇"\"調處,並返回"\"的位置
}
}
return j + 1;
}
/// <summary>
/// 在指定目錄下新建一個文件夾
/// </summary>
/// <param name="path"></param>
/// <param name="name"></param>
public static void CreateDir(string path, string name)
{
Directory.CreateDirectory(path + "\\" + name);
}
/// <summary>
/// 復制文件
/// </summary>
/// <param name="oldDir">原文件所在文件夾路徑</param>
/// <param name="Name">文件名</param>
/// <param name="newDir">新文件夾路徑</param>
public static void CopyFile(string oldDir, string Name, string newDir)
{
File.Copy(oldDir + "\\" + Name, newDir + "\\" + Name);
}
/// <summary>
/// 復制文件
/// </summary>
/// <param name="oldDir">原文件所在文件夾路徑</param>
/// <param name="newDir">新文件夾路徑</param>
public static void CopyFile(string oldDir, string newDir)
{
string name = oldDir.Substring(DirectoryName(oldDir));
File.Copy(oldDir, newDir + "\\" + name);
}
/// <summary>
/// 刪除指定文件夾
/// </summary>
/// <param name="strDir">文件夾完整路徑</param>
/// <param name="recursive">是否刪除文件夾子項</param>
public static void DeleteFolder(string strDir, bool recursive)
{
Directory.Delete(strDir, recursive);
}
/// <summary>
/// 返回指定路徑的DirectoryInfo
/// </summary>
/// <returns></returns>
public static DirectoryInfo GetDir(string path)
{
return new DirectoryInfo(path);
}
}
}
Txt.cs
CODE:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
namespace FileManager.Class
{
public class Txt
{
public Txt()
{
}
/// <summary>
/// 新建文件
/// </summary>
/// <param name="filename">文件名</param>
/// <param name="path">文件路徑</param>
public static void NewFile(string filename,string path)
{
filename.Trim();
if (filename == "")
{
MessageBox.Show("文件名不能為空~!");
}
else
{
if (File.Exists(path + "\\" + filename+".txt"))
{
MessageBox.Show("該文件名已經存在,請重命名");
}
else
{
string FullName = path + "\\" + filename + ".txt"; //獲得文件完整信息
StreamWriter Sw = File.CreateText(FullName);
}
}
}
/// <summary>
/// 新建文件(Enter鍵觸發)
/// </summary>
/// <param name="filename">文件名</param>
/// <param name="path">文件路徑</param>
public static void Enter(string filename, string path)
{
filename.Trim();
if (filename == "")
{
MessageBox.Show("文件名不能為空~!");
}
else
{
if (File.Exists(path + "\\" + filename+".txt"))
{
MessageBox.Show("該文件名已經存在,請重命名");
}
else
{
string FullName = path + "\\" + filename + ".txt"; //獲得文件完整信息
StreamWriter Sw = File.CreateText(FullName);
}
}
}
/// <summary>
/// 讀取顯示
/// </summary>
/// <param name="filename">文本文件名</param>
/// <param name="contents">內容</param>
public static string Display(string filename)
{//讀取顯示
try
{
string contents;
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); //讀出所打開的文本文件
StreamReader reader = new StreamReader(fs); //實例化一個streamreader
contents = reader.ReadToEnd(); //將數據顯示
fs.Close();
return contents;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return "";
}
}
/// <summary>
/// 打開
/// </summary>
/// <param name="ofd">打開對話框</param>
/// <param name="fullname">文本文件名</param>
/// <param name="contents">內容</param>
public static void Open(OpenFileDialog ofd,string fullname,string contents)
{//打開文本
try
{
if (ofd.ShowDialog() == DialogResult.OK)
{
string fileName = ofd.FileName; //文件名
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fs);
fullname = fileName;
contents = reader.ReadToEnd();
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 保存
/// </summary>
/// <param name="fullname">文本文件名</param>
/// <param name="contents">內容</param>
public static void Save(string fullname,string contents)
{//保存
try
{
StreamWriter writer = new StreamWriter(fullname);
writer.Write(contents); //用write()方法把txtContent的數據寫入文件
writer.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 另存為
/// </summary>
/// <param name="sfd">保存對話框</param>
/// <param name="contents">內容</param>
public static void SaveAs(SaveFileDialog sfd,string contents)
{
if (sfd.ShowDialog() == DialogResult.OK)
{
string fileName = sfd.FileName;
try
{
Stream stream = File.OpenWrite(fileName);
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(contents);
writer.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
/// <summary>
/// 粗體
/// </summary>
/// <param name="rtb"></param>
public static void Bold(RichTextBox rtb)
{
Font newFont = new Font(rtb.SelectionFont,
(rtb.SelectionFont.Bold ?
rtb.SelectionFont.Style & ~FontStyle.Bold :
rtb.SelectionFont.Style | FontStyle.Bold));
rtb.SelectionFont = newFont;
}
/// <summary>
/// 斜體
/// </summary>
/// <param name="rtb"></param>
public static void Italic(RichTextBox rtb)
{
Font newFont = new Font(rtb.SelectionFont,
(rtb.SelectionFont.Italic ?
rtb.SelectionFont.Style & ~FontStyle.Italic :
rtb.SelectionFont.Style | FontStyle.Italic));
rtb.SelectionFont = newFont;
}
/// <summary>
/// 下劃線
/// </summary>
/// <param name="rtb"></param>
public static void Underline(RichTextBox rtb)
{
Font newFont = new Font(rtb.SelectionFont,
(rtb.SelectionFont.Underline ?
rtb.SelectionFont.Style & ~FontStyle.Underline :
rtb.SelectionFont.Style | FontStyle.Underline));
rtb.SelectionFont = newFont;
}
/// <summary>
/// 復制
/// </summary>
/// <param name="rtb"></param>
public static void Copy(RichTextBox rtb)
{
if (rtb.SelectedText.Equals(""))
return;
Clipboard.SetDataObject(rtb.SelectedText, true);
}
/// <summary>
/// 剪切
/// </summary>
/// <param name="rtb"></param>
public static void Cut(RichTextBox rtb)
{
if (rtb.SelectedText.Length > 0)
{
try
{
rtb.Cut();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
/// <summary>
/// 粘貼
/// </summary>
/// <param name="rtb"></param>
public static void Paste(RichTextBox rtb)
{
rtb.Paste();
}
/// <summary>
/// 退出
/// </summary>
/// <param name="fullname">文本文件全名</param>
/// <param name="contents">內容</param>
public static void Exit(string fullname,string contents)
{
if (MessageBox.Show(" 是否保存文件",
"提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
try
{
StreamWriter writer = new StreamWriter(fullname);
writer.Write(contents); //用write()方法把txtContent的數據寫入文件
writer.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
/// <summary>
/// 在指定目錄新建一個文本文件
/// </summary>
/// <param name="path"></param>
/// <param name="name"></param>
/// <returns></returns>
public static StreamWriter CreateText(string path, string name)
{
return File.CreateText(path + "\\" + name);
}
/// <summary>
/// 刪除指定文件
/// </summary>
/// <param name="strFile">文件完整路徑</param>
public static void DeleteFile(string strFile)
{
File.Delete(strFile);
}
}
}