870920 Menu

JUCE类库附带示例的源码分析·1

Binary Builder

JUCE类库附带的命令行程序,可将某个目录下的所有文件转为程序代码中直接调用的char字节流,运行该程序后,生成的结果为一个类,该类包含两个常量,一个是char数组,另一个是数组的大小。该程序采用过程式编程,两个静态函数(一个负责将文件转为字节流,一个判断该文件是否具有隐藏属性),一个main()函数。将文件转为字节流的函数是本程序的核心。

重要的知识点和操作流程:将要转换的文件的数据加载到MemoryBlock内存块对象中,而后将内存块中的数据转为uint8数组(uint8相当于单字节无符号char),数组中的元素写入输出流对象,最后输出流对象将数据写入所对应的磁盘文件。

 文件数据转换为字节流,而后写入输出流对象的核心语句:
MemoryBlock mb; // 定义一个内存块对象
file.loadFileAsData (mb); // 将文件的二进制数据加载到内存块mb中
OutputStream outputStream; // 输出流对象,此处声明为示例。源码中该对象是函数的参数
// 将内存块中的数据存储到uint数组中(指向常量的常指针),即内存块数据转换为数组
const uint8* const data = (const uint8*) mb.getData();
for (size_t i = 0; i < mb.getSize(); ++i) // 将数组中的所有元素写入输出流对象
outputStream << (int) data[i] << “,”;

 基于所生成的磁盘文件创建输出流对象(流程有四:建立文件删除之,创建输出判断之):
// 首先定义文件对象,指明绝对路径和文件名
File headerFile (destDirectory.getChildFile(className).withFileExtension(“.h”));
File cppFile (destDirectory.getChildFile(className).withFileExtension(“.cpp”));

// 从磁盘中删除头文件和源文件 ,确保输出流对象的内容输出到全新的文件中,而不是追加
headerFile.deleteFile();
cppFile.deleteFile();
// 创建两个文件所对应的输出流对象,使用了作用域指针
ScopedPointer header (headerFile.createOutputStream());
ScopedPointer cpp (cppFile.createOutputStream());

// 判断输出流对象是否有效,防御式编程
if (header == nullptr || cpp == nullptr)
jassertfalse // 输出流对象无效!

 检测某个文件或目录是否具有隐藏属性和系统属性。递归算法。
// 1参:要检测的文件或目录,2参:1参的父目录或更上层目录
static bool isHiddenFile (const File& f, const File& root)
{
return f.getFileName().endsWithIgnoreCase (“.scc”) ||
f.getFileName() == “.svn” ||
f.getFileName().startsWithChar (‘.’) ||
(f.getSize() == 0 && ! f.isDirectory()) ||
(f.getParentDirectory() != root &&
isHiddenFile (f.getParentDirectory(), root));
}