文件属性读取
VBA 中的文件属性与标签操作指南

VBA 中的文件属性与标签操作指南随着计算机技术的不断发展与普及,文件管理成为了我们日常工作中不可避免的一部分。
而在 VBA(Visual Basic for Applications)编程中,文件属性与标签的操作是非常重要的。
本篇文章将向您介绍 VBA 中的文件属性与标签操作指南,帮助您更好地管理和操作文件。
一、文件属性的获取与修改在 VBA 中,我们可以使用 Shell 对象来获取或修改文件的属性。
以下是一些常用的文件属性的获取和修改方法:1. 文件路径和文件名通过 VBA 中的 FileDialog 对象,我们可以创建一个文件对话框并让用户选择文件。
然后,我们可以获取所选文件的路径和文件名,并将其保存到一个变量中,以便后续的操作。
2. 文件大小使用FileLen 函数可以获取文件的大小。
该函数接受文件的完整路径作为参数,返回文件的大小(以字节为单位)。
3. 创建日期和修改日期通过使用 VBA 中的 FileSystemObject 对象,我们可以获取文件的创建日期和修改日期。
使用此对象的 GetFile 方法,将文件路径作为参数传递给该方法,然后可以使用 FileDateTime 属性来获取文件的创建日期和修改日期。
4. 文件类型使用 FileSystemObject 对象的 GetExtensionName 方法,可以获取文件的扩展名。
该方法将文件路径作为参数传递,并返回文件的扩展名。
5. 文件属性使用 FileSystemObject 对象的 GetAttr 方法,可以获取文件的属性。
该方法将文件路径作为参数传递,并返回文件的属性。
例如,如果返回 1,则表示文件为只读属性。
以上是一些常用的文件属性的获取方法。
如果需要修改文件属性,可以使用SetAttr 方法。
这个方法接受文件路径和属性值作为参数,将属性值写入文件的属性中。
请注意,如果要修改文件的只读属性,需要在修改前先将其取消只读。
二、文件标签的操作文件标签是文件的元数据,用于描述文件的特定信息。
Properties的相对路径以及文件的读取操作

Properties的相对路径以及⽂件的读取操作在我们平时写程序的时候,有些参数是经常改变的,⽽这种改变不是我们预知的。
⽐如说我们开发了⼀个操作数据库的模块,在开发的时候我们连接本地的数据库那么 IP ,数据库名称,表名称,数据库主机等信息是我们本地的,要使得这个操作数据的模块具有通⽤性,那么以上信息就不能写死在程序⾥。
通常我们的做法是⽤配置⽂件来解决。
各种语⾔都有⾃⼰所⽀持的配置⽂件类型。
⽐如 Python,他⽀持 .ini⽂件。
因为他内部有⼀个 ConfigParser类来⽀持 .ini⽂件的读写,根据该类提供的⽅法程序员可以⾃由的来操作 .ini⽂件。
⽽在 Java中, Java⽀持的是 .properties⽂件的读写。
JDK内置的 java.util.Properties类为我们操作 .properties⽂件提供了便利。
⼀. .properties⽂件的形式 ==========================================================#以下为服务器、数据库信息dbPort = localhostdatabaseName = mydbdbUserName = rootdbPassword = root#以下为数据库表信息dbTable = mytable#以下为服务器信息ip = 192.168.0.9······在上⾯的⽂件中我们假设该⽂件名为: test.properties⽂件。
其中 #开始的⼀⾏为注释信息;在等号“ =”左边的我们称之为 key;等号“ =”右边的我们称之为 value 。
(其实就是我们常说的键 -值对) key应该是我们程序中的变量。
⽽ value是我们根据实际情况配置的。
⼆. JDK中的 Properties类 Properties类存在于胞 Java.util中,该类继承⾃ Hashtable ,它提供了⼏个主要的⽅法:1. ( key) ,⽤指定的键在此属性列表中搜索属性。
cmd命令读取文件夹的方法

cmd命令读取文件夹的方法在Windows操作系统中,我们可以使用命令提示符(cmd)来执行各种任务,包括读取文件夹中的文件。
通过cmd命令,我们可以快速查看文件夹中的文件列表、获取文件的属性信息以及进行文件操作等。
本文将介绍几个常用的cmd命令,以帮助您快速读取文件夹中的内容。
1. 查看文件夹中的文件列表我们可以使用dir命令来查看文件夹中的文件列表。
该命令会显示文件名、文件类型、文件大小和文件的最后修改时间等信息。
在cmd中输入以下命令即可查看文件夹中的文件列表:```dir 文件夹路径```其中,文件夹路径可以是绝对路径或相对路径。
例如,要查看当前文件夹中的文件列表,可以直接输入dir命令。
2. 获取文件的属性信息除了查看文件列表,我们还可以使用一些命令来获取文件的属性信息。
例如,我们可以使用attrib命令来查看文件的属性,如文件的只读属性、隐藏属性等。
在cmd中输入以下命令即可获取文件的属性信息:```attrib 文件路径```其中,文件路径可以是绝对路径或相对路径。
例如,要获取当前文件夹中某个文件的属性信息,可以直接输入attrib命令。
3. 进行文件操作除了查看文件列表和获取文件属性信息,我们还可以使用一些命令来进行文件操作。
例如,我们可以使用copy命令来复制文件,使用move命令来移动文件,使用del命令来删除文件等。
在cmd中输入以下命令即可进行文件操作:```copy 源文件路径目标文件路径move 源文件路径目标文件路径del 文件路径```其中,源文件路径和目标文件路径可以是绝对路径或相对路径。
例如,要将当前文件夹中的某个文件复制到另一个文件夹,可以使用copy命令;要删除当前文件夹中的某个文件,可以使用del命令。
4. 输出文件列表到文本文件有时候,我们需要将文件列表导出到文本文件中,以便后续处理。
在cmd中,我们可以使用dir命令的重定向功能实现这一功能。
在cmd中输入以下命令即可将文件列表输出到文本文件:```dir 文件夹路径 > 输出文件路径```其中,文件夹路径可以是绝对路径或相对路径,输出文件路径是导出文件的路径和文件名。
java 读取外部配置文件的方法

java 读取外部配置文件的方法Java是一种面向对象的编程语言,具有广泛的应用领域。
在Java开发中,有时需要读取外部配置文件来获取一些参数或配置信息。
下面将介绍一些常见的Java读取外部配置文件的方法。
1. 使用Java的Properties类:Java的Properties类是处理属性文件的工具类,非常适合读取外部配置文件。
以下是一个简单的示例代码:```javaimport java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class ReadConfigFile {public static void main(String[] args) {Properties prop = new Properties();try {prop.load(new FileInputStream("config.properties"));String value1 = prop.getProperty("key1");String value2 = prop.getProperty("key2");// 使用读取到的配置信息进行后续操作} catch (IOException e) {e.printStackTrace();}}}```通过创建Properties对象并使用load()方法来读取配置文件,可以通过getProperty()方法获取配置文件中的具体键值对。
2. 使用Java的ResourceBundle类:ResourceBundle类提供了一种读取以属性键值对形式存储的配置文件的方式。
以下是一个简单的示例代码:```javaimport java.util.ResourceBundle;public class ReadConfigFile {public static void main(String[] args) {ResourceBundle bundle = ResourceBundle.getBundle("config");String value1 = bundle.getString("key1");String value2 = bundle.getString("key2");// 使用读取到的配置信息进行后续操作}}```使用getBundle()方法加载配置文件,通过getString()方法获取具体的配置信息。
C# 添加、读取、删除Excel文档属性

C# 添加、读取、删除Excel文档属性在文档属性中,可以设置诸多关于文档的信息,如创建时间、作者、单位、类别、关键词、备注等摘要信息以及一些自定义的文档属性。
下面将通过C#程序来演示如何设置,同时对文档内的已有信息,也可以实现读取或删除等操作。
示例大纲:1. 添加文档属性1.1 添加摘要信息1.2 添加自定义文档信息2. 读取文档属性3. 删除文档信息3.1 删除所有摘要信息、自定义文档属性3.2 删除指定只要信息、自定义文档属性使用工具:Spire.XLS for .NET pack获取方法1:通过官网下载包。
下载后,解压文件,安装Bin文件夹下的程序。
安装后,将安装路径下Bin文件夹下的Spire.Xls.dll文件添加引用至vs项目程序。
如下所示:获取方法2:可通过Nuget下载。
C# 示例【示例】添加文档属性using Spire.Xls;using System;namespace AddProperties{class Program{static void Main(string[] args){//加载Excel文档Workbook workbook = new Workbook();workbook.LoadFromFile("test.xlsx");//设置摘要workbook.DocumentProperties.Author = "Mara";workbook.DocumentProperties.Title = "摘要";workbook.DocumentProperties.Keywords = "摘要,属性";workbook.DocumentProperties.Category = "展示文档";pany = "冰蓝科技";ments = "请勿修改";workbook.DocumentProperties.Subject = "测试";workbook.DocumentProperties.Manager = "Tom";//设置自定义属性workbook.CustomDocumentProperties.Add("_MarkAsFinal", true);workbook.CustomDocumentProperties.Add("联系电话", 81705109);workbook.CustomDocumentProperties.Add("更新时间", DateTime.Now);//保存文档workbook.SaveToFile("AddProperties.xlsx", FileFormat.Version2010); }}}文档属性添加效果:【示例2】读取文档信息using Spire.Xls;using Spire.Xls.Collections;using Spire.Xls.Core;using System;namespace ReadProperties{class Program{static void Main(string[] args){//加载Excel文档Workbook wb = new Workbook();wb.LoadFromFile("AddProperties.xlsx");//获取文档属性Console.WriteLine("摘要信息:");Console.WriteLine("标题: " + wb.DocumentProperties.Title);Console.WriteLine("主题: " + wb.DocumentProperties.Subject);Console.WriteLine("作者: " + wb.DocumentProperties.Author);Console.WriteLine("管理者: " + wb.DocumentProperties.Manager);Console.WriteLine("公司: " + pany);Console.WriteLine("类别: " + wb.DocumentProperties.Category);Console.WriteLine("关键字: " + wb.DocumentProperties.Keywords);Console.WriteLine("备注: " + ments);//获取自定义属性Console.WriteLine("\n自定义属性:");for (int i = 0; i < wb.CustomDocumentProperties.Count; i++){Console.WriteLine(wb.CustomDocumentProperties[i].Name + ": " + wb.CustomDocumentProperties[i].Value);}Console.Read();}}}文档属性读取结果:【示例3】删除文档属性using Spire.Xls;namespace DeleteProperties{class Program{static void Main(string[] args){//加载工作簿Workbook workbook = new Workbook();workbook.LoadFromFile("AddProperties.xlsx");//删除摘要及自定义文档属性workbook.DocumentProperties.Clear();//删除所有摘要信息workbook.CustomDocumentProperties.Clear();//删除所有自定义文档属性//保存文档workbook.SaveToFile("DeleteProperties.xlsx", FileFormat.Version2013);/*//删除指定摘要及自定义文档属性workbook.DocumentProperties.Author = "";//设置指定摘要信息为空,删除摘要内容 workbook.CustomDocumentProperties.Remove("联系电话");//删除指定名称的自定义文档属性workbook.SaveToFile("DeleteCustomDocumentProperties.xlsx",FileFormat.Version2013);*/}}}文档属性删除结果:(本文完)。
Spring框架读取property属性文件常用5种方法

Spring框架读取property属性⽂件常⽤5种⽅法1、⽅式⼀:通过spring框架 PropertyPlaceholderConfigurer ⼯具实现<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="ignoreUnresolvablePlaceholders" value="true"/><property name="locations"><value>classpath:conf/jdbc.properties</value></property><property name="fileEncoding"><value>UTF-8</value></property><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /></bean><!-- 数据源配置 --><bean id="dataSource" class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${database.connection.driver}"/><property name="url" value="${database.connection.url}"/><property name="username" value="${ername}"/><property name="password" value="${database.connection.password}"/></bean><!-- DAL客户端接⼝实现-><bean id="dalClient" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>2、⽅式⼆:简化配置<beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:jee="/schema/jee" xmlns:aop="/schema/aop"xmlns:context="/schema/context" xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd/schema/jee /schema/jee/spring-jee.xsd/schema/context /schema/context/spring-context.xsd/schema/aop /schema/aop/spring-aop.xsd/schema/tx /schema/tx/spring-tx.xsd"><context:property-placeholder location="classpath:conf/jdbc.properties" ignore-unresolvable="true"/><!-- 数据源配置 --><bean id="dataSource" class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${database.connection.driver}"/><property name="url" value="${database.connection.url}"/><property name="username" value="${ername}"/><property name="password" value="${database.connection.password}"/></bean><!-- DAL客户端接⼝实现--><bean id="dalClient" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!--备注:如果${} 这种写法⽆法读取到,或者编译出错,则增加ignore-unresolvable="true"的属性信息,并添加上⽂的命名空间信息-->jdbc.properties⽂件:database.connection.driver=com.mysql.jdbc.Driverdatabase.connection.url=jdbc:mysql://*.*.*.*:3306/mysql?characterEncoding=utf-8ername=*database.connection.password=*上述配置理解:1)ignore-unresolvable属性的⽰意:<xsd:documentation><![CDATA[Specifies if failure to find the property value to replace a key should be ignored.Default is "false", meaning that this placeholder configurer will raise an exceptionif it cannot resolve a key. Set to "true" to allow the configurer to pass on the keyto any others in the context that have not yet visited the key in question.]]>翻译后:指定是否应忽略未能找到⽤于替换键的属性值。
简单读取properties文件和xml文件两种方法
因为web工程上的连接数据库属性,需要不断改动。
可以把常改动的属性值列入properties文件,或者xml文件操作数据库连接时,直接进行读取文件,增加许多方便性以下是两种读取文件的工具类和properties,xml文件模板 ,还有其方法的测试结果方法一:读取properties文件jdbc.properties 模板代码1.jdbc.driverClassName=com.mysql.jdbc.Driver2.jdbc.url=jdbc\:mysql\://localhost\:3306/jiqimao?useUnicode\=true&characterEncoding\=GBKername=jiqimao4.jdbc.password=jiqimaoRpropertiesUtils.javaJava代码1.package utils;2.3.4.import java.io.IOException;5.import java.io.InputStream;6.import java.util.Properties;7.8./**9. * 描述:读取properties配置文件10. * @author 齐继超11. *12. */13.public class RpropertiesUtils {14.15. /**16. * 配置文件名称,注意文件请放到Source Folder根目录下17. */18. private static String fileName = "jdbc.properties";19.20. /**21. * 描述:根据key获取所对应的value值22. * @param key23. * @return24. * 作者:齐继超25. * 时间:Nov 25, 201026. */27. public static String get(String key){28. return get(fileName,key);29. }30.31.32. /**33. * 描述:进行读取properties配置文件34. * @param fileName35. * @param key36. * @return37. * 作者:齐继超38. * 时间:Nov 25, 201039. */40. public static String get(String fileName,String key){41.42. //根据当前执行线程返回该线程的上下文 ClassLoader43. ClassLoader classLoader = Thread.currentThread().getContextClassLoader();44. String value = "";45. try {46. //加载类获取源,读入输入流47. InputStream in = classLoader.getResource(fileName).openStream();48.49. //定义个持久的属性集50. Properties properties = new Properties();51.52. //从输入流读取属性列表53. properties.load(in);54.55. //用指定的key获取属性列表中的属性值56. value = properties.getProperty(key);57. } catch (IOException e) {58. e.printStackTrace();59. throw new RuntimeException("读取配置文件出错");60. }61. return value;62. }63.64.65.66.67.}测试读取properties文件Java代码1.package Test;2.3.import utils.RpropertiesUtils;4.5.public class TestProperties{6. public static void main(String[] args) {7.8. //测试读取properties文件9. System.out.println(RpropertiesUtils.get("jdbc.url"));10. //输出结果"jdbc:mysql://localhost:3306/jiqimao?useUnicode=true&characterE ncoding=GBK"11.12. }13.}方法二:读取xml文件jdbc.xml 模板Xml代码1.<?xml version="1.0"encoding="utf-8"?>2.<!DOCTYPE properties SYSTEM "/dtd/properties.dtd">3.<properties version="1.0">4.<comment>xml</comment>5.<entry key="driverClassName">com.mysql.jdbc.Driver</entry>6.<entry key="url">jdbc:mysql://localhost:3306/jiqimao?useUnicode=true&characterEncoding=GBK</entry>7.<entry key="username">jiqimao</entry>8.<entry key="password">jiqimao</entry>9.</properties>Rxmlutils.java代码Java代码1.package utils;2.3.import java.io.File;4.import java.io.FileInputStream;5.import java.io.IOException;6.import java.util.HashMap;7.import java.util.Map;8.import java.util.Properties;9.10./**11. * 描述:用properties类读写xml文件12. * @author 齐继超13. *14.*/15.public class RxmlUtils {16.17. /**18. * 定义xml文件的路径19. */20. private static String fileName = "final/jdbc.xml";21.22.23. /**24. * 描述:根据key取出对应value值25. * @param key26. * @return27. * 作者:齐继超28. * 时间:Nov 26, 201029. */30. public static String get(String key){31. return get(fileName,key);32. }33.34.35.36. /**37. * 描述:getValue方法的重载38. * @return39. * 作者:齐继超40. * 时间:Nov 26, 201041. */42. public static String get(String fileName,String key){43.44. //给定路径名来创建一个新 File 实例。
读取文件的方式
读取文件的方式本文主要介绍四种常用的方法:1、利用Excel对象来处理文件;2、利用VBA文件处理语句来处理文件;3、利用FileSystemObject对象来处理文件;4、利用API函数来处理文件。
当然对于数据库文件,还可以利用ADO+SQL的方法操作,不过论坛已经有前辈详细介绍过此类方法,本文就不再重复了。
一、利用Excel对象来处理文件利用Excel对象自带的方法来操作文件是最方便,也是最简单的。
我们主要利用Workbooks集合和Workbook对象的方法来操作文件。
1、打开Excel文件我们可以用Workbooks.Open方法打开一个Excel工作簿。
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)其中FileName是必选的参数,表示要打开的工作簿名,如果没有指定路径,则代表当前路径。
另外14个是可选参数,除了密码参数,其他的一般很少用。
具体的含义可以参看VBA 的帮助。
例:Workbooks.Open "F:\test.xls"可以打开F盘的test.xls文件。
2、打开文本文件使用Open方法也可以打开文本文件,但建议使用OpenText方法。
此方法是载入一个文本文件,并将其作为包含单个工作表的工作簿进行分列处理,然后在此工作表中放入经过分列处理的文本文件数据。
完整语法如下:Workbooks.OpenText(FileName, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local)关于以上参数的具体含义可以参看VBA的帮助,这里就不重复了。
读取属性配置文件的五种方式
读取属性配置⽂件的五种⽅式读取属性配置⽂件的五种⽅式@Value@ConfigurationProperties@PropertySource + @Value@PropertySource + ConfigurationPropertiesorg.springframework.core.env.Environment读取属性配置的⽰例属性配置⽂件application.properties#服务端⼝号server.port=9424# redis配置# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端⼝spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=demo.properties=huangdemo.sex=1demo.type=demo⽅式⼀:使⽤注解@Value读取属性配置package com.huang.pims.demo.props;import org.springframework.beans.factory.annotation.Value;import ponent;@Componentpublic class ReadByValue {@Value("${server.port}")private int serverPort;@Overridepublic String toString() {return"ReadByValue{" +"serverPort=" + serverPort +'}';}} 使⽤此种⽅式,如⽆其他需求,可不写setter、getter⽅法。
⽅式⼆:使⽤注解@ConfigurationProperties读取属性配置package com.huang.pims.demo.props;import org.springframework.boot.context.properties.ConfigurationProperties;import ponent;@Component@ConfigurationProperties(prefix = "spring.redis")public class ReadByConfigurationProperties {private int database;private String host;private String password;private int port;public void setDatabase(int database) {this.database = database;}public void setHost(String host) {this.host = host;}public void setPassword(String password) {this.password = password;}public void setPort(int port) {this.port = port;}public int getDatabase() {return database;}public int getPort() {return port;}public String getHost() {return host;}public String getPassword() {return password;}@Overridepublic String toString() {return "ReadByConfigurationProperties{" +"database=" + database +", host='" + host + '\'' +", password='" + password + '\'' +", port=" + port +'}';}} 使⽤此种⽅式,必须要有成员变量的setter、getter⽅法。
如何在Windows上设置文件的只读属性
如何在Windows上设置文件的只读属性在Windows操作系统中,设置文件的只读属性可以保护文件不被意外的修改或删除。
这对于保护重要文件非常有用,尤其是在共享计算机或将文件传递给其他人时。
本文将介绍如何在Windows上设置文件的只读属性,以便您可以轻松地保护您的文件安全。
一、通过文件属性设置只读属性通过文件属性设置只读属性是最常见的方法之一,它在Windows资源管理器中可以轻松实现。
请按照以下步骤操作:1. 找到您希望设置只读属性的文件。
可以通过资源管理器浏览到文件所在的文件夹。
2. 单击鼠标右键,然后选择“属性”。
这将打开文件的属性窗口。
3. 在属性窗口中,找到“常规”选项卡,并勾选“只读”复选框。
勾选后,“只读”属性将应用于文件。
4. 单击“应用”按钮,然后单击“确定”按钮保存更改。
文件现在具有只读属性,并且其他用户将无法修改文件。
二、使用命令提示符设置只读属性除了通过文件属性设置只读属性外,您还可以使用命令提示符来实现。
这对于批量处理多个文件特别有用。
请按照以下步骤进行操作:1. 打开命令提示符。
可以通过搜索菜单中的“cmd”来找到并打开它。
2. 在命令提示符窗口中,使用“cd”命令导航到包含您希望设置只读属性的文件的文件夹。
例如,如果您的文件位于“C:\Documents”文件夹中,可以输入以下命令更改目录:```cd C:\Documents```3. 输入以下命令来设置只读属性:```attrib +r 文件名```其中,“文件名”是您希望设置只读属性的文件的名称。
例如,如果您要设置名为“example.txt”的文件为只读属性,输入以下命令:```attrib +r example.txt```4. 按下Enter键执行该命令。
命令提示符将显示成功设置文件只读属性的消息。
三、使用批处理文件设置只读属性如果您需要为多个文件设置只读属性,手动一个个进行设置可能会非常繁琐。
为了简化这个过程,您可以创建一个批处理文件来自动设置只读属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:本文讲述了在Visual C++下编程实现对磁盘文件的属性进行获取以及更改的一般方法,并给出部分相关的关键代码。
一、引言
文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创建、读取和写入文件。
对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。
以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间等等进行提取处理与重新设置。
二、WIN32_FIND_DATA结构
关于文件的全部属性信息,总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。
在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。
在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构
WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。
该结构的内容如下:
typedef struct_WIN32_FIND_DATA{
DWORD dwFileAttributes;//文件属性
FILETIME ftCreationTime;//文件创建时间
FILETIME ftLastAccessTime;//文件最后一次访问时间
FILETIME ftLastWriteTime;//文件最后一次修改时间
DWORD nFileSizeHigh;//文件长度高32位
DWORD nFileSizeLow;//文件长度低32位
DWORD dwReserved0;//系统保留
DWORD dwReserved1;//系统保留
TCHAR cFileName[MAX_PATH];//长文件名
TCHAR cAlternateFileName[14];//8.3格式文件名
}WIN32_FIND_DATA,*PWIN32_FIND_DATA;
可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:
WIN32_FIND_DATA ffd;
HANDLE hFind=FindFirstFile("c:\\test.dat",&ffd);
在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作
为一个只读数据,其所有的成员变量都会由系统完成填写。
在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。
三、文件属性信息的获取与更改
为了更好的保存获取到的文件属性信息,对应于文件属性构造一个自定义的FILE_INFO 数据结构,获取的属性信息可暂存于此:
typedef struct_FILE_INFO{
TCHAR szFileTitle[128];//文件的标题名
DWORD dwFileAttributes;//文件的属性
FILETIME ftCreationTime;//文件的创建时间
FILETIME ftLastAccessTime;//文件的最后访问时间
FILETIME ftLastWriteTime;//文件的最后修改时间
DWORD nFileSizeHigh;//文件大小的高位双字
DWORD nFileSizeLow;//文件大小的低位双字
DWORD dwReserved0;//保留,为0
DWORD dwReserved1;//保留,为0
}FILE_INFO,*PFILE_INFO;
首先用FindFirstFile()函数将文件属性获取到WIN32_FIND_DATA结构对象FindFileData中去,之后可以用FindClose()将其关闭,并把FindFileData中的有关文件属性信息的内容复制到自定义结构FILE_INFO的结构对象FileInfo中备用。
下面是关于这部分描述的部分关键代码:
//声明结构对象
FILE_INFO FileInfo;
WIN32_FIND_DATA FindFileData;
……
//获取文件属性信息
FindClose(FindFirstFile("Test.txt",&FindFileData));
memset(&FileInfo,0,sizeof(FILE_INFO));
……
//将文件属性信息保存到FileInfo中备用
strcpy(FileInfo.szFileTitle,myFile.GetFileTitle());
FileInfo.dwFileAttributes=FindFileData.dwFileAttributes;
FileInfo.ftCreationTime=FindFileData.ftCreationTime;
FileInfo.ftLastAccessTime=FindFileData.ftLastAccessTime;
FileInfo.ftLastWriteTime=FindFileData.ftLastWriteTime;
FileInfo.nFileSizeHigh=FindFileData.nFileSizeHigh;
FileInfo.nFileSizeLow=FindFileData.nFileSizeLow;
……
在获取到文件的原始属性信息后既可以原封不动的将属性重新写到文件,也可以对其中
某一项或某几项属性内容进行修改后再行写入文件,从而达到更改文件属性的目的。
比如可以用SetFileTime()函数设置文件的创建时间、最近一次访问时间以及最近一次修改的时间等等:
SetFileTime((HANDLE)destFile.m_hFile,//待写入的文件句柄
&FileInfo.ftCreationTime,//文件的创建时间
&FileInfo.ftLastAccessTime,//文件最近一次的访问时间
&FileInfo.ftLastWriteTime);//文件最近一次的修改时间
也可以用SetFileAttributes()函数实现对文件属性的修改:
SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);
至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。
小结:本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。
用此技术可以在通讯等对文件有严格要求的应用领域实现文件全部信息(包括文件内容、文件名以及文件属性等)的完整传送。
本文所述程序在Windows98下由Microsoft Visual C++6.0编译调试通过。