开发中常遇到要读取指定文件夹中的某一类文件,这时如果每次都以拼字符串地址的形式查找文件比较麻烦,分享两个读取指定文件夹中某一类文件的方法。以图片文件为例:1、以WWW方式进行加载,显示在RawImage上;2、以数据流形式读取文件,显示在RawImage上。
一、WWW加载
首先我们创建一个字典,new Dictionary<int, Texture>(),存储图片及对应编号。这里我预先将图片名批处理为从“0001”开始的连续的编号,方便处理。
现在可以开始用WWW加载文件了,注意使用WWW加载本地文件时,地址中尽量不要用中文。
private void LoadByWWW()
{
string url = PlayerPrefs.GetString("imagePath");
long length = GetDirectoryLength(url);
for (int i = 1; i < length; i++)
{
StartCoroutine(Load(i.ToString().PadLeft(4, '0')));
Debug.Log("i.ToString().PadLeft(4, '0'):" + i.ToString().PadLeft(4, '0'));
}
}
IEnumerator Load(string index)
{
WWW w = new WWW(@"file:///" + PlayerPrefs.GetString("imagePath") + index + ".jpg");
yield return w;
int i = int.Parse(index);
Debug.Log("dirArr:" + i);
Debug.Log(@"file:///" + PlayerPrefs.GetString("imagePath") + index + ".jpg");
dirArr.Add(i, w.texture);
w.Dispose();
}
public long GetDirectoryLength(string dirPath)
{
//判断给定的路径是否存在,如果不存在则退出
if (!Directory.Exists(dirPath))
return 0;
long len = 0;
//定义一个DirectoryInfo对象
DirectoryInfo di = new DirectoryInfo(dirPath);
//通过GetFiles方法,获取di目录中的所有文件的大小
foreach (FileInfo fi in di.GetFiles())
{
len++;
}
return len;
}
加载完毕后,将图片赋给RawImage即可,注意代码运行顺序,要在加载完毕后调用赋值方法,即先加载完成后显示图片。由于WWW加载需要时间,会出现没有加载完成时,执行了显示图片,此时该图片未加载,导致报错。同时要注意,加载完成后要释放资源。
二、数据流读取
数据流加载文件不过多描述,直接上代码。
private void LoadPicture()
{
List<string> filePaths = new List<string>();
string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG";
string[] ImageType = imgtype.Split('|');
for (int i = 0; i < ImageType.Length; i++)
{
//获取d盘中a文件夹下所有的图片路径
string imagePath = PlayerPrefs.GetString("imagePath");
string[] dirs = Directory.GetFiles(imagePath, ImageType[i]);
for (int j = 0; j < dirs.Length; j++)
{
filePaths.Add(dirs[j]);
//Debug.Log("filePaths:" + filePaths);
}
}
for (int i = 0; i < filePaths.Count; i++)
{
Texture2D tx = new Texture2D(100, 100);
tx.LoadImage(getImageByte(filePaths[i]));
allTex2d.Add(tx);
}
filePaths.Clear();
}
/// <summary>
/// 根据图片路径返回图片的字节流byte[]
/// </summary>
/// <param name="imagePath">图片路径</param>
/// <returns>返回的字节流</returns>
private static byte[] getImageByte(string imagePath)
{
FileStream files = new FileStream(imagePath, FileMode.Open);
imgByte = new byte[files.Length];
files.Read(imgByte, 0, (int)files.Length);
files.Close();
files.Dispose();
files = null;
return imgByte;
}
同样要注意释放资源。