ThinkPHP 入门系列
T T h h i i n n k k P P H H P F F r r a a m m e e w w o o r r k 1 1. .0
D D a a t t a a A A c c c c e e s s s M M a a n n u u a a l
T T h h i i n n k k P P H H P 1 1. .0
数 数据 据操 操作 作指 指南 南
编写:ThinkPHP 文档组
最后更新:2008-06-15
目 目录
录 1
1 版权信息...................................................................................................................................4 2 2 数据操作.. (5)
2.1
数据库访问层...................................................................................................................5 2.2
表和主键.........................................................................................................................6 2.3
属性访问.........................................................................................................................8 2.4
连接数据库....................................................................................................................10 2.5
使用 PDO.......................................................................................................................12 2.6
ActiveRecord..................................................................................................................13 2.7
普通查询.......................................................................................................................18 2.8
条件查询.......................................................................................................................19 2.9
区间查询.......................................................................................................................19 2.10
组合查询....................................................................................................................20 2.11
多字段查询 ................................................................................................................20 2.12
统计查询....................................................................................................................21 2.13
定位查询....................................................................................................................21 2.14 动态查询.. (22)
2.15 SQL 查询 (22)
2.16
事务支持....................................................................................................................23 2.17
延迟查询....................................................................................................................24 2.18 分布式数据库. (41)
2.19 多数据库连接 (43)
2.20 表间关联 (25)
2.21 锁机制 (27)
2.22 文本字段 (29)
2.23 连贯操作 (30)
2.24 聚合模型 (31)
2.25 视图模型 (34)
2.26 单表继承 (35)
2.27 字段映射 (37)
2.28 数据验证 (37)
2.29 数据填充 (40)
2.30 自动时间戳写入 (44)
2.31 回调方法 (46)
2.32 调试技巧 (47)
2.33 查询技巧 (49)
1 版权信息
发布本资料须遵守开放出版许可协议 1.0 或者更新版本。
未经版权所有者明确授权,禁止发行本文档及其被实质上修改的版本。
未经版权所有者事先授权,禁止将此作品及其衍生作品以标准(纸质)书籍形式发行。
如果有兴趣再发行或再版本手册的全部或部分内容,不论修改过与否,或者有任何问题,请联系版权 所有者 liu21st@https://www.doczj.com/doc/2b15086.html,。
对 ThinkPHP 有任何疑问或者建议,请进入官方论坛 [ https://www.doczj.com/doc/2b15086.html, ] 发布相关讨论。 并在此感谢 ThinkPHP 团队的所有成员和所有关注和支持 ThinkPHP 的朋友。
有关 ThinkPHP 项目及本文档的最新资料,请及时访问 ThinkPHP 项目主站 https://www.doczj.com/doc/2b15086.html, 。
2 数据操作
2 2. .1 数 数据 据库 库访 访问 问层
层 业务逻辑一般都是对数据的访问和操作,ThinkPHP 内置实现了一个抽象数据库访问层,实现上参考了 部分目前比较先进的抽象数据库访问层框架,并且会保持不断完善。
ThinkPHP 的抽象数据库访问层主要包含了数据库公共类、数据库驱动类和一些辅助类。在实际应用开 发过程中, 你可能并不需要接触这些类库, 只需要通过各自的Model 对象来访问和操作数据库就可以。 数据库操作类库的主要特点有:
1.
支持事务和回滚(当然首先需要数据库本身支持),默认是自动提交 2.
支持调试模式 3.
完全支持中文 UTF‐8 字符集 4.
把查询操作和执行操作分开,便于返回不同的结果 5.
支持配置文件和 DSN 两种数据库配置读取方式 6.
支持对数据集的数组和对象两种方式返回 7.
支持多个数据库连接 8. 支持主从式分布式数据库
数据库类库中最重要就是公共类 Db 的实现,除了引导各种数据库驱动之外,它还提供了数据库抽象 访问的一些基本方法,包括 CURD 的 SQL 指令的抽象访问。查询的结果返回数组,并统一通过 Model 数据对象来访问,最终的目的是为了让应用操作数据库更加方便有效。
抽象数据库访问层的关键类库在于数据库的公共访问类 Db 类,这个类是操作数据库的底层接口,换 句话说,Db 类不能够独立存在,必须有对应的数据库驱动类库,但是开发人员不能够跨过该类直接进
行数据库操作的访问。 目前系统支持的数据库包含有MySQL 、 MySQLi 、 MsSQL 、 PgSQL 、 SqLite 和 Oracle , 以及 PDO 的支持,还可以通过插件方式增加自己需要的数据库驱动,开发人员也可以按照规范编写自 己的数据库驱动(甚至包括众多的嵌入式数据库的驱动)。
2 2. .2 表 表和 和模 模型 型的 的命 命名
名 当我们创建一个 UserModel 类的时候,其实已经遵循了系统的约定。ThinkPHP 要求数据库的表名和模 型类的命名遵循一定的规范,首先数据库的表名和字段全部采用小写形式,模型类的命名规则是除去 表前缀的数据表名称,并且首字母大写,然后加上模型类的后缀定义,例如:
UserModel 表示 User 数据对象, (假设数据库的前缀定义是 think_)其对应的数据表应该是
think_user
UserTypeModel 对应的数据表是 think_usertype
User_typeModel 对应的数据表是 think_user_type
如果你的规则和系统的约定不符合,那么需要设置 Model 类的 tableName 属性。
在 ThinkPHP 的模型里面,有两个数据表名称的定义:
1、tableName 不包含表前后缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和 当前的模型类的名称不同的时候才需要定义。
2、trueTableName 包含前后缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只 有当上面的规则都不适用的情况下才需要设置。
下面举个例子来加深理解:
例如,在数据库里面有一个 think_categories 表,而我们定义的模型类名称是 CategoryModel ,按照系 统的约定,这个模型的名称是 Category ,对应的数据表名称应该是 think_category (全部小写),但是
现在的数据表名称是think_categories ,因此我们就需要设置 tableName 属性来改变默认的规则(假设 我们已经在配置文件里面定义了 DB_PREFIX 为 think_)。
protected $tableName = 'categories'?
// 注意这个属性的定义不需要加表的前缀 think_
而对于另外一种特殊情况,数据库中有一个表(top_depts )的前缀和其它表前缀不同,不是 think_ 而 是 top_,这个时候我们就需要定义 trueTableName 属性了
protected $trueTableName = 'top_depts'?
// 注意 trueTableName 需要完整的表名定义
另外,我们来了解下表后缀的含义。表后缀通常情况下用处不大,因为这个表的设计有关。但是个别 情况下也是有用,例如,我们在定义数据表的时候统一采用复数形式定义,下面是我们设计的几个表 名 think_users 、 think_categories 、 think_blogs , 我们定义的模型类分别是 UserModel 、 CategoryModel 、 BlogModel ,按照上面的方式,我们必须给每个模型类定义 tableName 属性。其实我们可以通过设置表 后缀的方式来实现相同的效果,我们可以设置 DB_SUFFIX 配置参数为 s ,那么系统在获取真实的表名 的时候就会自动加上这个定义的表后缀,我们就不必给每个模型类定义 tableName 属性了,而只是对 categories 这样的复数情况单独定义 trueTableName 属性就可以了。
2 2. .
3 获 获取 取字 字段
段 我们在 UserModel 类里面根本没有定义任何 User 表的字段信息, 但是系统是如何做到属性对应数据表 的字段呢?这是因为 ThinkPHP 可以在运行时动态获取数据表的字段信息(确切的说,是在第一次运行 的时候,而且只需要一次,以后会永久缓存字段信息,除非删除) ,包括数据表的主键字段和是否自动 增长等等,如果需要显式获取当前数据表的字段信息,可以使用getDbFields 方法来获取。如果你在开 发过程中修改了数据表的字段信息,可能需要清空 Temp 目录下面的缓存文件,让系统重新获取更新
的数据表字段信息。
也可以在模型类里面手动定义数据表字段的名称,可以避免 IO 加载的效率开销,例如: class UserModel extends Model {
protected $fields = array(
'id',
'username',
'email',
'age',
'_pk'=>'id',
'_autoInc'=>true
)
}
其中_pk 表示主键字段名称 _autoInc 表示主键是否自动增长类型
1.0.3以上版本增加了数据库字段缓存的开关 可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓 存,如果在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文 件中增加如下配置:
'DB_FIELDS_CACHE'=>false
ThinkPHP 的默认约定每个数据表的主键名采用统一的id 作为标识,并且是自动增长类型的。系统会自 动识别当前操作的数据表的字段信息和主键名称, 所以即使你的主键不是 id , 也无需进行额外的设置, 系统会自动识别。要在外部获取当前数据对象的主键名称,请使用下面的方法:
$Model = getPk()?
2 2. .4 属 属性 性访 访问
问 因为 Model 对象本身就属于数据对象,所以属性的访问就显得非常直观和简单。
最常用的访问方式是直接通过数据对象访问,例如
$User = D(“User”);
$User‐>find(1);
// 获取 name 属性的值
echo $User‐>name;
// 设置 name属性的值
$User‐>name = ‘ThinkPHP’;
还有一种属性的操作方式是通过返回一个数据对象的方式:
$User = D(“User”);
// 注意这里返回的 user 数据对象可能并不一定是对象,也可以是一个数组 // 系统默认的惯例配置返回的是一个数组参考 DATA_RESULT_TYPE 的配置值 $user = $User‐>find(1);
// 如果 DATA_RESULT_TYPE 是 1 那么使用下面的方式操作
// 获取 name属性的值
echo $user‐>name;
// 设置 name属性的值
$user‐>name = ‘ThinkPHP’;
// 如果 DATA_RESULT_TYPE 是 0 那么使用下面的方式操作
// 获取 name属性的值
echo$user[‘name’];
// 设置 name属性的值
$user[‘name’] = ‘ThinkPHP’;
两种方式的属性区别是一个是对象的属性,一个是数组的索引名称。
那么如何获取当前数据对象的所有属性呢,有两个方法可以做到:
使用 getDbFields方法来获取当前数据对象的属性数组
$User‐>getDbFields();
// 第二种方式可以直接遍历数据字段,该方式仅限于在没有任何数据操作之前
foreach ($User as $field){
echo($field);
}
2 2. .5 连 连接 接数 数据 据库
库 ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db 类进 行操作,而无需针对不同的数据库写不同的代码和底层实现,Db 类会自动调用相应的数据库适配器来 处理。目前的数据库包括 MySQL 、PgSQL 、Sqlite 和PDO 的支持,如果应用需要使用数据库,必须配置 数据库连接信息,数据库的配置文件有多种定义方式:
第一种 在项目配置文件里面定义 Return array(
'DB_TYPE'=> 'mysql',
'DB_HOST'=> 'localhost',
'DB_NAME'=>'thinkphp',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',
// 其他项目配置参数………
)?
系统推荐使用该种方式,因为一般一个项目的数据库访问配置是相同的。该方法系统在连接数据库的 时候会自动获取,无需手动连接。
可以对每个项目定义不同的数据库连接信息, 还可以在调试配置文件里面定义调试数据库的配置信息, 如果在项目配置文件和调试模式配置文件里面同时定义了数据库连接信息,那么在调试模式下面后者 生效,部署模式下面前者生效。
第二种 使用DSN 方式在初始化 Db 类的时候传参数
$db_dsn=“mysql://username:passwd@localhost:3306/DbName”;
$db=new Db($db_dsn);
该方式主要用于在控制器里面自己手动连接数据库的情况,或者用于创建多个数据库连接。
第三种 使用数组传参数
$DSN = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'dbname'
)?
$db=new Db($DSN);
该方式也是用于手动连接数据库的情况,或者用于创建多个数据库连接。
第四种 在模型类里面定义
protected $connection = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'dbname'
)?
// 或者使用下面的定义
protected $connection =”mysql://username:passwd@localhost:3306/DbName”;
如果在某个模型类里面定义了connection 属性,则在实例化模型对象的时候,会使用该数据库连接信 息进行数据库连接。通常用于某些数据表位于当前数据库连接之外的其它数据库。
ThinkPHP 并不是在一开始就会连接数据库,而是在有数据查询操作的时候才会去连接数据库。额外的 情况是,在系统第一次操作模型的时候,框架会自动连接数据库获取相关模型类的数据字段信息,并 缓存下来。
2 2. .6 使 使用 用 P P D
D O ThinkPHP 支持 PDO 方式,如果要使用 PDO 方式连接数据库,可以参考下面的设置。
我们以项目配置文件定义为例来说明: Return array(
'DB_TYPE'=> 'pdo',
// 注意 DSN 的配置针对不同的数据库有所区别 请参考 PHP 手册 PDO 类库部分
'DB_DSN'=> 'mysql:host=localhost?dbname=think',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PREFIX'=>'think_',
// 其他项目配置参数………
)?
使用 PDO 方式的时候,要注意检查是否开启相关的 PDO 模块。
2 2. .7 A A c c t t i i v v e e R R e e c c o o r r d
ThinkPHP实现了ActiveRecords模式的ORM模型, 采用了非标准的ORM模型: 表映射到类, 记录 (集) 映射到对象, 字段属性映射到对象的虚拟属性。 最大的特点就是使用方便, 从而达到敏捷开发的目的。
开发过程中, 只需要定义好模型类就可以进行方便的数据操作了, 例如我们定义了一个UserModel类: class UserModel extends Model{
}
甚至无需增加任何属性和方法,我们就可以进行下面的操作了。
$User = D("User")? // 实例化 User 对象
// 或者 $User = new UserModel()?
$User->find(1)? // 查找 id 为 1 的记录
$User->name = 'ThinkPHP'? // 把查找到的记录的名称字段修改为 ThinkPHP
$User->save()? // 保存修改的数据
比 ActiveRecord 模式更加高级的是,ThinkPHP可以把记录集映射到对象,例如
$User->findAll()?
foreach ($User as $user){
echo $user->name?// 可以结合配置来使用 $user['name']
}
ThinkPHP 提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四个基本操作(CURD) : 创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了 ActiveRecords 模式的 最佳体验。
新建记录
// 实例化一个 User 模型对象
$User = new UserModel()?
// 然后给数据对象赋值
$User->name = 'ThinkPHP'?
$User->email = 'ThinkPHP@https://www.doczj.com/doc/2b15086.html,'?
// 然后就可以保存新建的 User 对象了
$User->add()?
// 如果需要锁实例化模型对象的时候传入数据,可以使用
$data['name'] = 'ThinkPHP'?
$data['email'] = 'ThinkPHP@https://www.doczj.com/doc/2b15086.html,'?
$User = new UserModel($data)?
$User->add()?
// 或者直接在 add 方法传入要新建的数据
$data['name'] = 'ThinkPHP'?
$data['email'] = 'ThinkPHP@https://www.doczj.com/doc/2b15086.html,'?
$User = new UserModel()?
$User->add($data)?
如果你的主键是自动增长类型,不需要传入主键的值就可以新建数据,并且如果插入数据成功的话, Add 方法的返回值就是最新插入的主键值,可以直接获取。
$insertId = $User->add($data)?
一般情况下,应用中的数据对象不太可能通过手动赋值的方式写入,而是有个数据对象的创建过程。 ThinkPHP 提供了一个 create 方法来创建数据对象,然后进行其它的新增或者编辑操作。
$User = D("User")?
$User->create()? // 创建 User 数据对象,默认通过表单提交的数据进行创建
$User->add()? // 新增表单提交的数据
Create 方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等
$data['name'] = 'ThinkPHP'?
$data['email'] = 'ThinkPHP@https://www.doczj.com/doc/2b15086.html,'?
$User->create($data)?
// 从 User 数据对象创建新的 Member 数据对象
$Member = D("Member")?
$Member->create($User)?
支持新增多条记录
$User = new UserModel()?
$data[0]['name'] = 'ThinkPHP'?
$data[0]['email'] = 'ThinkPHP@https://www.doczj.com/doc/2b15086.html,'?
$data[1]['name'] = '流年'?
$data[1]['email'] = 'liu21st@https://www.doczj.com/doc/2b15086.html,'?
$User->addAll($data)?
在 MySql 数据库下面,会自动使用一条 SQL 语句实现多数据的插入。
查询记录
读取数据库的记录我觉得是数据库操作中的最有意思的一件事情了,写过文本数据库的人都知道,保 存和删除数据不难(无非是规范和效率问题),难在可以通过各种方式来查找需要的数据。ThinkPHP 通过各种努力,让数据库的查询操作变得轻而易举,也让 ThinkPHP 变得富有内涵。
ThinkPHP 有一个非常明确的约定,就是单个数据查询和多个数据查询的方法是分开的,或者你会认为 有时候自己也不知道要查询的数据是单个还是多个,但是有一点是明确的,你需要的是返回一个数据 还是希望返回的是一个数据集。因为对两种类型的返回数据的操作方式是截然不同的,无论何种方式 的返回,我们都可以直接在模型对象里面操作,当然也一样可以作为数据传递给你需要的变量。
先举个最简单的例子,假如我们要查询主键为 8的某个用户记录,我们可以使用下面的一些方法: $User->find(8)?
这个作为查询语言来说是最为直观的,如果查询成功,查询的结果直接保存在当前的数据对象中,在 进行下一次查询操作之前,我们都可以提取,例如获取查询的结果数据:
$name = $User->name?
$email = $User->email?
遍历查询到的数据对象属性
foreach ($User as $key=>$val){
echo($key.':'.$val)?
}
// 或者进行相关的数据更改和保存操作
也可以用变量保存下来以便随时使用。
$user = $User->find(8)?
对于上面的查询条件,我们还可以使用 getById 来完成相同的查询
$User->getById(8)?
需要注意的是,对于 find 方法来说,即使查询结果有多条记录,也只会返回符合条件的第一条记录, 如果要返回符合要求的所有记录,请使用 findAll 方法。
// 查询主键为 1、3、8 的记录集
$User->findAll('1,3,8')?
// 遍历数据列表
foreach ($User as $vo){
dump($vo->name)?
}
更多的查询操作请参考后面章节的内容。
更新记录
了解了查询记录后,更新操作就显得非常简单了。
$User->find(1)? // 查找主键为 1 的数据
$User->name = 'TOPThink'? // 修改数据对象
$User->save()? // 保存当前数据对象
// 还可以使用下面的方式更新
$User->score = '(score+1)'? // 对用户的积分加 1
$User->save()?
如果不是使用数据对象的方式来保存,可以传入要保存的数据和条件 $data['id'] = 1?
$data['name'] = 'TopThink'?
$User->save($data)?
除了 save 方法外,你还可以使用 setField 方法来更新特定字段的值,例如: $User->setField('name','TopThink','id=1')?
同样可以支持对字段的操作
$User->setField('score','(score+1)','id=1')?
// 或者改成下面的
$User->setInc('score','id=1')?
删除记录
$User->find(2)?
$User->delete()? // 删除查找到的记录
$User->delete('5,6')? // 删除主键为 5、6 的数据
$User->deleteAll()? // 删除查询出来的所有数据
注意事项
在 ThinkPHP 里面 AR 模式和普通模式结合起来使用,根据实际的项目需要。因此有时候,也不要拘泥 于 AR 模式的操作~
2 2. .8 普 普通 通查 查询
询 ThinkPHP 大多数情况使用的都是对象查询,因为充分利用了 ORM 查询语言,了解查询条件的定义对 使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,通常我们可以使用 HashMap 对 象或者索引数组来传递查询条件。查询条件可以用于find 、findAll 等所有有查询条件的方法,下面是 几种查询条件的定义:
普通查询 // 注意在使用 HashMap 之前需要手动导入
$condition = new HashMap ()?
// 查询 name 为 thinkphp 的记录
$condition ->put ('name','thinkphp')?
// 或者使用下面的方式赋值
$condition ->name = 'thinkphp'?
// 使用数组作为查询条件
$condition = Array()?
$condition ['name'] = 'thinkphp'?
使用 Map 方式查询和使用数组查询的效果是相同的,并且是可以互换的。
2 2. .9 条 条件 件查 查询
询 在查询条件里面,如果仅仅使用
$map ->put ('name','thinkphp')?
查询条件应该是 name = 'thinkphp'
如果需要进行其它方式的条件判断,可以使用 $map ->put ('name',array('like','thinkphp%'))?
这样,查询条件就变成 name like 'thinkphp%'
$map ->put ('id',array('gt',100))?
表示的查询条件就是 id > 100
$map ->put ('id',array('in','1,3,8'))?
// 或者使用数组范围
$map ->put ('id',array('in',array(1,3,8)))?
上面表示的查询条件都是 id in (1,3,8)
支持的查询表达式有
EQ|NEQ|GT|EGT|LT|ELT|LIKE|BETWEEN|IN|NOT IN
2 2. .1 10 区 区间 间查 查询
询 ThinkPHP 支持对某个字段的区间查询,例如:
$map ->put ('id',array(1,10))? // id >=1 and id<=10
$map ->put ('id',array('10','3','or'))? //id >= 10 or id <=3
$map ->put ('id',array(array('neq',6),array('gt',3),'and'))? // id != 6 a nd id > 3
2 2. .1 11 组 组合 合查 查询
询 如果进行多字段查询,那么字段之间的逻辑关系是 逻辑与 AND ,但是用下面的规则可以更改默认的 逻辑判断,例如下面的查询条件: $map ->put ('id',array('neq',1))?
$map ->put ('name','ok')?
// 现在的条件是 id !=1 and name like '%ok%'
$map ->put ('_logic','or')?
// 现在的条件变为 id !=1 or name like '%ok%'
2 2. .1 12 多 多字 字段 段查 查询
询 ThinkPHP 还支持直接对进行多字段查询的方法, 可以简化查询表达式和完成最复杂的查询方法, 例如: $map ->put ('id,name,title',array(array('neq',1),array('like','%aaa'),arr ay('like','%bbb%'),'or'))?
查询条件是
( id != 1) OR ( name like '%aaa') OR ( title like '%bbb%')
如果结合上面的几种方式,我们可以写出下面更加复杂的查询条件
$map ->put ('id',array('NOT IN','1,6,9'))?
$map ->put ('name,title',array(array('like','%aaa'),array('like','%bbb%') ,'or'))?
以上查询条件变成:
( id NOT IN (1,6,9) ) AND ( ( name like '%aaa') OR ( title like '%bbb%') )
文件管理练习题 (一)单项选择题 1.操作系统对文件实行统一管理,最基本的是为用户提供( )功能。A.按名存取 B.文件共享 C.文件保护 D.提高文件的存取速度 2.按文件用途分类,编译程序是( )。 A.系统文件 B.库文件 C.用户文件 D.档案文件 3.( )是指将信息加工形成具有保留价值的文件。 A.库文件 B.档案文件 C.系统文件 D.临时文件 4.把一个文件保存在多个卷上称为( )。 A.单文件卷 B.多文件卷 C.多卷文件 D.多卷多文件 5.采取哪种文件存取方式,主要取决于( )。 A.用户的使用要求 B.存储介质的特性C.用户的使用要求和存储介质的特性 D.文件的逻辑结构 6.文件系统的按名存取主要是通过( )实现的。 A.存储空间管理 B.目录管理 C.文件安全性管理 D.文件读写管理 7.文件管理实际上是对( )的管理。 A.主存空间 B.辅助存储空间 C.逻辑地址空间D.物理地址空间 8.如果文件系统中有两个文件重名,不应采用( )结构。 A.一级目录 B.二级目录C.树形目录 D.一级目录和二级目录 9.树形目录中的主文件目录称为( )。 A.父目录 B.子目录 C.根目录 D.用户文件目录 10.绝对路径是从( )开始跟随的一条指向制定文件的路径。 A.用户文件目录 B.根目录C.当前目录 D.父目录 11.逻辑文件可分为流式文件和( )两类。A.索引文件 B.链接文件 C.记录式文件 D.只读文件 12.由一串信息组成,文件内信息不再划分可独立的单位,这是指( )。A.流式文件 B.记录式文件 C.连续文件 D.串联文件 13.记录式文件内可以独立存取的最小单位是由( )组成的。A.字 B.字节 C.数据项D.物理块 14.在随机存储方式中,用户以( )为单位对文件进行存取和检索。 A.字符串 B.数据项C.字节 D.逻辑记录 15.数据库文件的逻辑结构形式是( )。A.链接文件 B.流式文件 C.记录式文件 D.只读文件 16.文件的逻辑记录的大小是( )。 A.恒定的 B.相同的 C.不相同的 D.可相同也可不同 17.能用来唯一标识某个逻辑记录的数据项为记录的( )。 A.主键 B.次键 C.索引D.指针 18.在文件系统中,( )要求逻辑记录顺序与磁盘块顺序一致。A.顺序文件 B.链接文件 C.索引文件 D.串联文件 19.下列文件中,( )的物理结构不便于文件的扩充。A.顺序文件 B.链接文件 C.索引文件 D.多级索引文件 20.( )的物理结构对文件随机存取时必须按指针进行,效率较低。 A.连续文件 B.链接文件 C.索引文件 D.多级索引文件 2l.链接文件解决了顺序结构中存在的问题,它( )。 A.提高了存储空间的利用率 B.适合于随机存取方式 C不适用于顺序存取 D.指针存入主存,速度快
操作系统文件管理 博文很长,我把一章的内容都总结在这里了。 在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调入内存。如果由用户直接管理外存上的文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。显然,这是用户所不能胜任、也不愿意承担的工作。于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。 1. 有关文件的概念 文件: 具有符号名(文件名)的一组相关元素的有序序列,是一段程序或数据的集合。 文件系统: 是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用。 文件系统包含文件管理程序(文件与目录的集合)和所管理的全部文件,是用户与外存的接口,系统软件为用户提供统一方法(以数据记录的逻辑单位),访问存储在物理介质上的信息。 有关直接(随机)存取设备的磁盘知识:硬盘的读写原理和磁盘碎片的产生 2. 文件的分类 按性质和用途分类:系统文件、库文件、用户文件。 系统文件:由系统软件构成的文件,只允许用户通过系统调用或系统提供的专用命今来执行它们,不允许对其进行读写和修改。主要有操作系统核心和各种系统应用程序或实用工具程序和数据组成库文件:文件允许用户对其进行读取和执行,但不允许对其进行修改。主要由各种标准子程序库组成 用户文件:是用户通过操作系统保存的用户文件,由文件的所有者或所有者授权的用户才能使
昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第二学期) 课程名称:操作系统开课实验室:年月日 一、实验目的 用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而 对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验原理及基本技术路线图(方框原理图) 用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。 功能设计: Help 显示命令帮助 dir 显示当前目录下的文件和文件夹 exit 退出系统 create [文件名] 创建文本文件 cdir [目录名] 创建文件夹 read [文件名] 读取一个文件最多可同时读取五个 close[文件名] 关闭一个文件 edit [文件名] 编辑一个文件 cd [目录名] 进子目录或者上级目录 attr [文件名] 显示该文件的属性 del [文件名] 删除文件 rename [文件名] 重命名
编辑功能流程图
删除文件流程图创建文件流程图 核心算法: bool Format(void); //格式化 bool install(void); //装载虚拟硬盘的数据 void login(void); /用户登陆
void showMenu(void);//显示功能菜单 bool onAction(void);//用户选择功能并执行 void createFile(string str);//创建文件 bool read(string str);//读取文件 void editFile(string str);//编辑文件 void Delete(string str);//删除一个文件 数据结构: /*---------常变量------*/ const unsigned int BLOCK_SIZE=512; //块长 const unsigned int DATA_BLOCK_NUM=512; //数据块数量 const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置 const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=32; //inode数量 const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址 const unsigned int ACCOUNT_NUM=10; //用户数量 /*inode结构体*/ struct inode{ unsigned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:"."和".."*/ unsigned short di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户0为根目录ID,一次下去是管理员目
第七章文件管理 第一节文件和文件系统 一、文件系统的引入 1、用户在使用计算机的过程中遇到的有关软件资源的两个基本问题: ●产生了新的资源时:怎样长期存放; ●使用系统中现有资源时:怎样检索,如何使用; 解决的方法:把信息以一种单元--文件--的形式存储在磁盘或其他外部存储介质上。文件由操作系统来统一管理,包括:文件的结构,命名,存取,使用,保护,以及实现方法。 2、现代OS中引入文件系统的目的 ●管理系统和用户的软件资源,让用户实现对信息的“按名存取”; ●提供信息的存储、检索、更新、共享和文件保护等一系列文件操作,使用户能方便有效地使用和操作文件; ●文件系统给用户带来的好处是:使用方便、数据安全、接口统一 3、文件系统的功能 ●统一管理文件的存储空间(外存空间),实施存储空间的分配与回收●实现文件的按名存取:名字空间映射存储空间 ●实现文件信息的共享,并提供文件的保护和保密措施 ●向用户提供一个方便使用的接口 ●系统维护及向用户提供有关信息 ●提供与I/O的统一接口 文件系统在操作系统接口中占的比例最大,用户使用操作系统的
感觉在很大程度上取决于对文件系统的使用效果。 二、文件系统中的相关概念 1、数据项:构成文件内容的基本单位 ●基本数据项。这是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,即原子数据,又称为数据元素或字段。它的命名往往与其属性一致。 ●组合数据项。它是由若干个基本数据项组成的,简称组项。 2、记录:是一组相关数据项的集合,用于描述一个对象在某方面的一组属性。 3、关键字:是能唯一标识一个记录的数据项。记录的关键字可以不止一个;关键字可以是一个基本数据项,也可以是一个组合数据项。 4、文件:是指由创建者所定义的、具有文件名的一组相关信息的集合,可分为有结构文件和无结构文件两种。 在有结构的文件中,文件由若干个相关记录组成(是记录的序列);而无结构文件则被看成是一个字符(字节)流。 文件是文件系统中一个最大的数据单位,它描述了一个对象集。 图7-1文件、记录和数据项之间的层次关系
第12章文件管理 复习题: 12.1、域和记录有什么不同? 答:域(field)是基本数据单位。一个域包含一个值。记录(record)是一组相关的域的集合,它可以看做是应用程序的一个单元。 12.2、文件和数据库有什么不同? 答:文件(file)是一组相似记录的集合,它被用户和应用程序看做是一个实体,并可以通过名字访问。数据库(database)是一组相关的数据集合,它的本质 特征是数据元素间存在着明确的关系,并且可供不同的应用程序使用。 12.3、什么是文件管理系统? 答:文件管理系统是一组系统软件,为使用文件的用户和应用程序提供服务。12.4、选择文件组织时的重要原则是什么? 答:访问快速,易于修改,节约存储空间,维护简单,可靠性。 12.5、列出并简单定义五种文件组织。 答:堆是最简单的文件组织形式。数据按它们到达的顺序被采集,每个记录由一串数据组成。顺序文件是最常用的文件组织形式。在这类文件中,每个记录 都使用一种固定的格式。所有记录都具有相同的长度,并且由相同数目、长度 固定的域按特定的顺序组成。由于每个域的长度和位置已知,因此只需要保存 各个域的值,每个域的域名和长度是该文件结构的属性。索引顺序文件保留 了顺序文件的关键特征:记录按照关键域的顺序组织起来。但它还增加了两个 特征:用于支持随机访问的文件索引和溢出文件。索引提供了快速接近目标记 录的查找能力。溢出文件类似于顺序文件中使用的日志文件,但是溢出文件中 的记录可以根据它前面记录的指针进行定位。索引文件:只能通过索引来访 问记录。其结果是对记录的放置位置不再有限制,只要至少有一个索引的指针 指向这条记录即可。此外,还可以使用长度可变的记录。直接文件或散列 文件:直接文件使用基于关键字的散列。 12.6、为什么在索引顺序文件中查找一个记录的平均搜索时间小于在顺序文件中的平均 搜索时间? 答:在顺序文件中,查找一个记录是按顺序检测每一个记录直到有一个包含符合条件的关键域值的记录被找到。索引顺序文件提供一个执行最小穷举搜索的索引 结构。 12.7、对目录执行的典型操作有哪些? 答:搜索,创建文件,删除文件,显示目录,修改目录。 12.8、路径名和工作目录有什么关系? 答:路径名是由一系列从根目录或主目录向下到各个分支,最后直到该文件的路径 中的目录名和最后到达的文件名组成。工作目录是一个这样的目录,它是含有用 户正在使用的当前目录的树形结构。 12.9、可以授予或拒绝的某个特定用户对某个特定文件的访问权限通常有哪些? 答:无(none),知道(knowledge),执行(execution),读(reading),追加(appending), 更新(updating),改变保护(changing protection),删除(deletion)。 12.10、列出并简单定义三种组块方式。 答:固定组块(fixed blocking):使用固定长度的记录,并且若干条完整的记录被保存在一个块中。在每个块的末尾可能会有一些未使用的空间,称为内部碎片。
课程设计:模拟文件管理 1设计目的 (1)建立一个简单的模拟文件管理系统。 (2)理解用户界面和操作命令在操作系统中的作用。 2设计要求 需要实现一个命令行操作界面,包含如下命令: 1.创建文件 功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。 2.删除文件 功能:删除指定的文件 3.创建目录 功能:在当前路径下创建指定的目录。 4.删除目录 功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。 5.改变目录 功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。 6.显示目录 功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。 对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误情况,程序应该作出相应处理并给出错误信息。 界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致,可以自己设计更多的命令或者附加功能。 3环境 本实验是在windows xp+vc 6.0环境下实现的,利用windows SDK 提供的系统接口(API)完成程序功能。在windows xp下安装好VC后进行,VC是一个集成开发环境,其中包含了windows SDK所有工具,所
以就不用单独在安装SDK了,程序中所用的API是操作系统提供的用来进行应用程序设计的系统功能接口。要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。一些特殊的API 调用还需要包含其他的头文件。 4步骤 1. 打开VC,选择菜单项File->New,选择File选项卡并建立一个名 为FileSyste.cpp的文件。 2. 此时将打开一个FileSystem.cpp文件的编辑窗口,在其中编辑程 序,编辑好原文件并保存。 3. 通过调用菜单项Build->Build进行编译连接,此时系统提示是否 创建工程,选择“Yes”可自动创建相应工程。可以在指定的工程 目录下得到debug->FileSystem.exe程序,可以直接运行改程序或 者在控制台进入该debug目录运行程序。 5程序代码 1. #include "stdio.h" 2. #include "windows.h" 3. #include "string.h" 4. #include
考研操作系统-文件管理(三) (总分:64.00,做题时间:90分钟) 一、单项选择题 (总题数:16,分数:32.00) 1.目录文件所存放的信息是( )。 A.某一文件存放的数据信息 B.某一文件的文件目录 C.该目录中所有数据文件目录 D.该目录中所有子目录文件和数据文件的目录 A. B. C. D. √ 本题考查目录文件的基本概念。目录文件是文件控制块的有序集合,一个目录中可能既有子目录也有数据文件,目录文件中要包含子目录和数据的信息。因此本题选择D。 2.文件目录项中不包含( )。 A.文件名 B.文件访问权限说明 C.文件控制块的物理位置 D.文件所在的物理位置 A. B. C. √ D. 本题考查文件目录项的相关概念。文件目录项即文件控制块,通常由文件基本信息、存取控制信息和使用信息组成。其中基本信息包含文件物理位置,显然在文件目录项中不包含文件控制块的物理位置的信息。因此本题选择C。 3.文件系统中,文件访问控制信息存储的合理位置是( )。 A.文件控制块 B.文件分配表 C.用户口令表 D.系统注册表 A. √ B. C. D. 本题考查文件控制块的组成。文件控制块中包含文件访问控制信息。因此本题选择A。 4.某顺序文件含有10000个记录,平均查找的记录数为5000个。若采用索引顺序文件结构,则最好情况下平均只需查找( )次记录。 A.1000 B.10000 C.100 D.500 A. B. C. √ D. 本题考查顺序文件和索引顺序文件的查找计算。采用索引顺序文件结构时,最好的情况是分组,每组100个记录,这样查找时的平均查找记录个数=50+50=100。因此本题选择C。 5.设置当前工作目录的主要目的是( )。 A.节省外存空间 B.节省内容空间 C.加快文件的检索速度 D.加快文件的读写速度 A. B.
第六部分文件管理 1、文件系统的主要目的是()。 A、实现对文件的按名存取 B、实现虚拟存储 C、提供外存的读写速度 D、用于存储系统文件 2、文件系统是指()。 A、文件的集合 B、文件的目录集合 C、实现文件管理的一组软件 D、文件、管理文件的软件及数据结构的总体 3、文件管理实际上是管理()。 A、主存空间 B、辅助存储空间 C、逻辑地址空间 D、物理地址空间 4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构是()。 A、顺序文件 B、链接文件 C、索引文件 D、系统文件 5、下列描述不是文件系统功能的是()。 A、建立文件目录 B、提供一组文件操作 C、实现对磁盘的驱动调度 D、实现从逻辑文件到物理文件间的转换 6、文件系统在创建一个文件时,为它建立一个()。 A、文件目录 B、目录文件 C、逻辑结构 D、逻辑空间 7、索引式(随机)文件组织的一个主要优点是( )。 A、不需要链接指针 B、能实现物理块的动态分配 C、回收实现比较简单 D、用户存取方便 8、面向用户的文件组织机构属于( )。 A、虚拟结构 B、实际结构 C、逻辑结构 D、物理结构 9、按文件用途来分,编译程序是()。 A、用户文件 B、档案文件 C、系统文件 D、库文件 10、将信息加工形成具有保留价值的文件是()。 A、库文件 B、档案文件 C、系统文件 D、临时文件 11、文件目录的主要作用是()。 A、按名存取 B、提高速度 C、节省空间 D、提高外存利用率 12、如果文件系统中有两个文件重名,不应采用()。 A、一级目录结构 B、树型目录结构 C、二级目录结构 D、A和C 13、文件系统采用树型目录结构后,对于不同用户的文件,其文件名()。 A、应该相同 B、应该不同 C、可以不同,也可以相同 D、受系统约束 14、文件系统采用二级文件目录可以()。 A、缩短访问存储器的时间 B、实现文件共享 C、节省内存空间 D、解决不同用户间的文件命名冲突
计算机应用基础课教案(首页)(代号A-3)
计算机应用基础课教案(代号A—4) 文件管理 一、[复习旧课] (提问)1、窗口的组成部分? 2、命令名称呈灰色表示什么?命令后有“…”表示什么?命令 后有黑色三角又表示什么? 3、窗口能不能改变大小、能不能移动窗口?办法是什么? 4、能不能改变对话框的大小?能不能移动对话框? 二、[导入新课] 计算机系统中的数据是以文件的形式存储在磁盘上的,文件是最小的数据组织单位,文件分类存放在文件夹中。磁盘,特别是硬盘,存放着大量的文件和文件夹,这就需要对文件和文件夹进行管理。 三、[知识点讲授] (一)文件相关知识 1、文件:计算机用户的文本、图像和声音等信息,以文件的形式存储在外存储器里。在计算机中,为了便于信息的存储、提取和使用,以文件的方式来管理这些信息。 (1)文件的概念 所谓文件,就是相关信息的集合,这些信息可以是程序、图像、图形、文字、声音等。例如:一份自己的文字资料、图片字老等都可以作为文件。 (2)文件的命名:在计算机系统中,通过文件的名称对信息进行管理。 文件名=主文件名(简称文件名)+ 文件扩展名(类型名) 在文件名和文件扩展名之间加一个点“.” ?Windows操作系统中文件的命名规则 ●文件或文件夹可以使用长文件名,名称最多可以有255个字符. ●使用字母可以保留指定的大小写格式,但不能用大小写区分文 件名,例如:ABC.DOC和abd.doc 被认为是同一个文件。 ●文件名中可以使用汉字和空格,但空格作为文件名的开头字符 或单独作为文件名不起作用。 ●文件的扩展名可以使用多哥字符,可以使用多间隔符,但只有 最后一个分隔符后的部分能作为文件的扩展名。 ●文件名中不能使用的字符有\ / :* ?“< >︴。 ●同一磁盘的同一文件夹中不能有同名的文件和文件夹(文件和 文件夹的名称也不能相同)。 (3)文件的属性:文件和文件夹都有属性。 在Windows操作系统中文件的的属性有只读、隐藏和存档属性。具有只读属性的文件或文件夹,只能被访问,不能进行修改或删除;具有
竭诚为您提供优质文档/双击可除操作系统文件管理实验报告 篇一:操作系统实验报告文件管理 昆明理工大学信息工程与自动化学院学生实验报告 (201—201学年第二学期) 课程名称:操作系统开课实验室:年月日 一、实验目的 用c或c++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验原理及基本技术路线图(方框原理图) 用c模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。 功能设计: helpdirexitcreate[文件名]cdir[目录名]read[文件
名]close[文件名]edit[文件名]cd[目录名]attr[文件 名]del[文件名]rename[文件名]显示命令帮助显示当前目录下的文件和文件夹退出系统创建文本文件创建文件夹读取一个文件最多可同时读取五个关闭一个文件编辑一个文件进子目录或者上级目录显示该文件的属性删除文件重命名 编辑功能流程图 删除文件流程图创建文件流程图 核心算法: boolFormat(void);//格式化boolinstall(void);//装载虚拟硬盘的数据voidlogin(void);/用户登陆 voidshowmenu(void);//显示功能菜单 boolonAction(void);//用户选择功能并执行voidcreateFile(stringstr);//创建文件 boolread(stringstr);//读取文件 voideditFile(stringstr);//编辑文件 voidDelete(stringstr);//删除一个文件 数据结构: 始地址 /*inode结构体 */structinode{unsignedshortdi_tag;/*inode标识*/ /*关联文件数,当为0时表示删除文件,如一个目录至