C#选择文件、选择文件夹、打开文件(或者文件夹)
1、选择文件用OpenDialog
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = true;//该值确定是否可以选择多个文件
dialog.Title = "请选择文件夹";
dialog.Filter = "所有文件(*.*)|*.*";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string file = dialog.FileName;
}
Filter 属性 赋值为一字符串 用于过滤文件类型;
字符串说明如下:
‘|’分割的两个,一个是注释,一个是真的Filter,显示出来的是那个注释。如果要一次显示多中类型的文件,用分号分开。
如:
Open1.Filter="图片文件(*.jpg,*.gif,*.bmp)|*.jpg;*.gif;*.bmp";
则过滤的文件类型为 “|”号 右边的 *.jpg;*.gif;*.bmp 三种类型文件,在OpenDialog/SaveDialog中显示给用户看的文件类型字符串则是 :“|”号 左边的 图片文件(*.jpg,*.gif,*.bmp)。
再如:
Open1.Filter="图像文件(*.jpg;*.jpg;*.jpeg;*.gif;*.png)|*.jpg;*.jpeg;*.gif;*.png";
2、使用System.Windows.Forms.FolderBrowserDialog选择文件夹
System.Windows.Forms.FolderBrowserDialog dialog =new System.Windows.Forms.FolderBrowserDialog();
dialog.Description = "请选择Txt所在文件夹";
if (dialog.ShowDialog()==System.Windows.Forms.DialogResult.OK )
{
if (string.IsNullOrEmpty(dialog.SelectedPath))
{
System.Windows.MessageBox.Show(this, "文件夹路径不能为空", "提示");
return;
}
this.LoadingText = "处理中...";
this.LoadingDisplay = true;
Action<string> a = DaoRuData;
a.BeginInvoke(dialog.SelectedPath,asyncCallback, a);
}
3、直接打开某路径下的文件或者文件夹
System.Diagnostics.Process.Start("ExpLore", "C:\\window");
4 检查是否有文件夹
//检查有该路径是否就创建
if (!Directory.Exists(toFileFullPath))
{
Directory.CreateDirectory(toFileFullPath);
}
5 判断是否有文件
if (File.Exists(path)) //判断文件是否存在
{
File.Delete(HttpRuntime.AppDomainAppPath + model.FilePath);
//删除表中记录
}
SaveFileDialog savedialog = new SaveFileDialog();
savedialog.Filter = "Jpg 图片|*.jpg|Bmp 图片|*.bmp|Gif 图片|*.gif|Png 图片|*.png|Wmf 图片|*.wmf";
savedialog.FilterIndex = 0;
savedialog.RestoreDirectory = true;//保存对话框是否记忆上次打开的目录
savedialog.CheckPathExists = true;//检查目录
savedialog.FileName = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "-"; ;//设置默认文件名
if (savedialog.ShowDialog() == DialogResult.OK)
{
image.Save(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);// image为要保存的图片
MessageBox.Show(this, "图片保存成功!", "信息提示");
}
7 文件与图片的转化
public int FileToStream()//文件到流的转换
{
Image img = new Bitmap(SourFilePath);
MemoryStream stream = new MemoryStream();
img.Save(stream, ImageFormat.Bmp);
BinaryReader br = new BinaryReader(stream);
photo = stream.ToArray();
stream.Close();
return 0;
}
public Image ShowPic()//根据流显图
{
byte[] bytes = photo;
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
Image img = Image.FromStream(ms);
ms.Close();
return img;
}
public int StreamToFile()//反向转换
{
byte[] bytes = photo;
FileStream fs = new FileStream(ObjFilePath, FileMode.Create, FileAccess.Write);
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
fs.Close();
return 0;
}
8 读取图片文件
/// <summary>
/// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static Bitmap ReadImageFile(string path)
{
FileStream fs = File.OpenRead(path); //OpenRead
int filelength = 0;
filelength = (int)fs.Length; //获得文件长度
Byte[] image = new Byte[filelength]; //建立一个字节数组
fs.Read(image, 0, filelength); //按字节流读取
System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
fs.Close();
Bitmap bit = new Bitmap(result);
return bit;
}
#region 保存web图片到本地
/// <summary>
/// 保存web图片到本地
/// </summary>
/// <param name="imgUrl">web图片路径</param>
/// <param name="path">保存路径</param>
/// <param name="fileName">保存文件名</param>
/// <returns></returns>
public static string SaveImageFromWeb(string imgUrl, string path, string fileName)
{
if (path.Equals(""))
throw new Exception("未指定保存文件的路径");
string imgName = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("/") + 1);
string defaultType = ".jpg";
string[] imgTypes = new string[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };
string imgType = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("."));
string imgPath = "";
foreach (string it in imgTypes)
{
if (imgType.ToLower().Equals(it))
break;
if (it.Equals(".bmp"))
imgType = defaultType;
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl);
request.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)";
request.Timeout = 3000;
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
if (response.ContentType.ToLower().StartsWith("image/"))
{
byte[] arrayByte = new byte[1024];
int imgLong = (int)response.ContentLength;
int l = 0;
if (fileName == "")
fileName = imgName;
FileStream fso = new FileStream(path + fileName + imgType, FileMode.Create);
while (l < imgLong)
{
int i = stream.Read(arrayByte, 0, 1024);
fso.Write(arrayByte, 0, i);
l += i;
}
fso.Close();
stream.Close();
response.Close();
imgPath = fileName + imgType;
return imgPath;
}
else
{
return "";
}
}
10利用image直接保存
image.Save(toFileFullPath + fileName);
11 读取字节转化为图片
/// <summary>
/// 读取byte[]并转化为图片
/// </summary>
/// <param name="bytes">byte[]</param>
/// <returns>Image</returns>
private Image GetImageByBytes(byte[] bytes)
{
Image photo = null;
using (MemoryStream ms = new MemoryStream(bytes))
{
ms.Write(bytes, 0, bytes.Length);
photo = Image.FromStream(ms, true);
}
return photo;
}
13 读取网络请求转换为图片
private Image ImageFromWeb(String url )
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();
Image img = Image.FromStream(response.GetResponseStream());
return img;
}
文件说明:
File类一些常用的静态方法:
方法说明:
Copy()
将文件复制到规定的位置
Create()
在规定的路径上创建文件
Delete()
删除文件
Open()
在规定的路径上返回FileStream对象
Move()
将规定的文件移动到新位置。可以在新位置为文件规定不同的名称
Directory类一些常用的静态方法:
方法说明
CreateDirectory()
创建具有规定路径的目录
Delete()
删除规定的目录以及其中的所有文件
GetDirectories()
返回表示当前目录之下的目录的Directory对象的数组
GetFiles()
返回在当前目录中的File对象的数组
Move()
将规定的目录移动到新位置。可以在新位置为文件夹规定一个新名称
FileInfo类:
它没有静态方法,仅可用于实例化的对象。FileInfo对象表示在磁盘或网络位置的文件。注意它不是流。为了实现对文件的读取或写入,必须创建Stream对象。
如果仅在对象上进行单一方法调用,则可以使用静态File类。在此,静态调用要快一些,因为.Net Framework不必遍历实例化新对象并调用方法的过程。但是如果应用程序在文件上执行几种操作,在实例化FileInfo对象并使用其方法就更好一些。这会节省时间,因为对象将在文件系统上引用正确的文件,而静态类就必须每次都寻找文件。
FileInfo类提供的基础性的属性,可用来更新文件。
属性
说明
Attributes
获取或者设置当前文件的属性
CreationTime
获取当前文件的创建日期和时间
DirectoryName
返回文件目录的路径
Exists
判断是否存在文件
FullName
检索文件的完整路径
Length
获取文件的容量
Name
仅仅返回文件的名称,而不是完整的文件位置路径
DirectoryInfo类:
DirectoryInfo类的作用类似于FileInfo类。它是一个实例化的对象,表示计算机上的单一目录。同FileInfo类—样,在Directory和DirectoryInfo之间可以复制许多方法调用。当使用这二者时,可以便用相同的原则:如果进行单一调用,就使用静态Directory类。如果进行一系列调用,则使用实例化的DirectoryInfo对象。
DirectoryInfo类与FileInfo类共享几乎所有相同的属性,DirectoryInfo类作用在无文件的目录上除外。
FileStream对象:
表示在磁盘或网络路径上指向文件的流。当类提供向文件读取和写入字节的方法时,经常使用StreamReader和StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。
还有几种方法可以创建FileStream对象。构造函数具有许多不同的重载/版本,但是最简单的构造函数仅仅带有两个参数,即文件名和FileMode枚举。
FileStream aFile = new FileStream("a.txt",FileMode.OpenOrCreate);
FileMode枚举的成员:
FileMode枚举成员
说明
Append
如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建个新文件。FileMode.Append仅可以与枚举FileAccess.Write联合使用
Create
创建新文件,如果存在这样的文件就破坏它
CreateNew
创建新文件,但是如果已经存在了此文件,则抛出异常
Open
打开现有的文件。如果不存在所规定的文件,则抛出异常
OpenOrCreate
如果文件存在,则规定打开文件,否则就创建新文件。如果文件已经存在,则保留在文件中的数据
Truncate
打开现有文件,清除其内容。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。必须存在有文件,否则就会抛出异常
前面的构造函数默认以只读模式打开文件。需要一个附加参数规定不同的访问级别,此参数即FileAccess参数。
FileStream aFile = new FileStream("a.txt",FileMode.OpenOrCreate,FileAccess.Write);
此行代码将打开文件,对文件进行写访问。对文件的任何读的企图都会导致抛出异常。仅有3种类型的FileAccess枚举:Read,ReadWirte和Write。可以打开一个文件,只读、只写或进行读写操作。此属性的作用是:基于用户的身份验证级别改变用户对文件的访问。
付出最大努力,追求最高成就。
总结:
打开选择文件OpenDialog,等于open.ShowDialog()== DialogResult.OK,得到路径
打开选择文件夹FolderBrowserDialog 等于OK,得到路径
另存为SaveFileDialog
读取文件FileStream fs = File.OpenRead(path); //OpenRead
字节转换为图片 Image img = Image.FromStream(response.GetResponseStream());
把图片保存在某个文件下 Image image = GetImageByBytes(iamgebyte); img.Save(path);
打开某个文件流 FileStream fs = new FileStream(ObjFilePath, FileMode.Create, FileAccess.Write);
写入某个文件 fs.Write(bytes, 0, bytes.Length);
读取某个文件 fs. Read()(bytes, 0, bytes.Length);
参考文献: