进程中自我销毁

Option Explicit

Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100
Const THREAD_PRIORITY_NORMAL = 0
Const THREAD_PRIORITY_IDLE = -15
Const IDLE_PRIORITY_CLASS = &H40
Const DETACHED_PROCESS = &H8
Const CREATE_SUSPENDED = &H4
Const THREAD_PRIORITY_TIME_CRITICAL = 15
Const SW_HIDE = 0
Const STARTF_USESHOWWINDOW = &H1

Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

Declare Function GetModuleFileName Lib “kernel32” Alias “GetModuleFileNameA” (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Declare Function GetEnvironmentVariable Lib “kernel32” Alias “GetEnvironmentVariableA” (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Declare Function GetShortPathName Lib “kernel32” Alias “GetShortPathNameA” (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Declare Function GetCurrentProcess Lib “kernel32” () As Long
Declare Function GetCurrentThreadId Lib “kernel32” () As Long
Declare Function SetPriorityClass Lib “kernel32” (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Declare Function SetThreadPriority Lib “kernel32” (ByVal hThread As Long, ByVal nPriority As Long) As Long
Declare Function ResumeThread Lib “kernel32” (ByVal hThread As Long) As Long
Declare Function GetCurrentThread Lib “kernel32” () As Long
Declare Function CreateProcess Lib “kernel32” Alias “CreateProcessA” (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Function DeleteMe() As Boolean
Dim szModule As String
Dim szComspec As String
Dim szParams As String

Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim sa1 As SECURITY_ATTRIBUTES
Dim sa2 As SECURITY_ATTRIBUTES

szModule = String(512, 0)
szComspec = String(512, 0)
szParams = String(512, 0)

‘// get file path names:
If ((GetModuleFileName(0, szModule, 512) <> 0) And (GetShortPathName(szModule, szModule, 512) <> 0) And (GetEnvironmentVariable(“COMSPEC”, szComspec, 512) <> 0)) Then
‘// set command shell parameters
szComspec = Left(szComspec, InStr(szComspec, Chr(0)) – 1)
szModule = Left(szModule, InStr(szModule, Chr(0)) – 1)

szComspec = szComspec & ” /c del ” & szModule
‘下行支持带空格路径
‘szComspec = szComspec & ” /c del ” & “””” & szModule & “”””

‘// set struct members
With si
.cb = Len(si)
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = SW_HIDE
End With
‘// increase resource allocation to program
Call SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)
Call SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)

‘// invoke command shell
‘Debug.Print CreateProcess(vbNullString, szComspec, sa1, sa2, 0&, CREATE_SUSPENDED Or DETACHED_PROCESS, 0&, vbNullString, si, pi)
If CreateProcess(vbNullString, szComspec, sa1, sa2, 0, CREATE_SUSPENDED Or DETACHED_PROCESS, 0, vbNullString, si, pi) Then
‘// suppress command shell process until program exits
Call SetPriorityClass(pi.hProcess, IDLE_PRIORITY_CLASS)
Call SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE)

‘// resume shell process with new low priority
Call ResumeThread(pi.hThread)

‘// everything seemed to work
DeleteMe = True
Exit Function
Else ‘// if error, normalize allocation
Call SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS)
Call SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL)
End If
End If
DeleteMe = False
End Function

Public Sub KillMe()
Dim sPath As String
sPath = IIf(Right(App.Path, 1) = “\”, App.Path, App.Path & “\”)
On Error GoTo InIDE
Debug.Print 1 / 0 ‘触发IDE错误,防止删除 VB6.exe
Dim iFile As Integer
iFile = FreeFile
Open sPath & “KillMe.bat” For Output As #iFile
Print #iFile, “:Repeat” & vbCrLf & _
“del “”” & sPath & App.EXEName & “.exe””” & vbCrLf & _
“if exist “”” & sPath & App.EXEName & “.exe””” & ” goto Repeat” & vbCrLf & _
“del %0”
Close #iFile
Shell sPath & “KillMe.bat”, vbHide
InIDE:
End Sub

Public Sub DelMe()
Dim iFileNumber As Integer
On Error Resume Next
If App.LogMode Then
iFileNumber = FreeFile()
Open “del.tmp.vbs” For Output As iFileNumber
SetAttr “del.tmp.vbs”, vbHidden
Print #iFileNumber, “Dim FSO,WMI”
Print #iFileNumber, “Set WMI=GetObject(” & Chr(34) & “winmgmts://.” & Chr(34) & “)”
Print #iFileNumber, “Set FSO=CreateObject(” & Chr(34) & “Scripting.FileSystemObject” & Chr(34) & “)”
Print #iFileNumber, “Do While WMI.ExecQuery(” & Chr(34) & _
“SELECT * FROM WIN32_PROCESS WHERE NAME='” & App.EXEName & “.EXE'” & Chr(34) & “).Count”
Print #iFileNumber, “WScript.Sleep 1”
Print #iFileNumber, “Loop”
Print #iFileNumber, “FSO.DeleteFile ” & Chr(34) & App.Path & “/” & App.EXEName & “.EXE” & Chr(34)
Print #iFileNumber, “FSO.DeleteFile ” & Chr(34) & App.Path & “/del.tmp.vbs” & Chr(34)
Print #iFileNumber, “Set FSO=Nothing”
Print #iFileNumber, “Set WMI=Nothing”
Close #iFileNumber
Shell “WScript.Exe del.tmp.vbs”, vbHide
End If
End Sub

延迟(停滞)进程

Option Explicit
‘与Sleep相比,本模块的 Wait 不占用CPU的时间
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

‘Private Const WAIT_ABANDONED& = &H80&
‘Private Const WAIT_ABANDONED_0& = &H80&
‘Private Const WAIT_FAILED& = -1&
‘Private Const WAIT_IO_COMPLETION& = &HC0&
Private Const WAIT_OBJECT_0& = 0
‘Private Const WAIT_OBJECT_1& = 1
‘Private Const WAIT_TIMEOUT& = &H102&

Private Const INFINITE = &HFFFF
Private Const ERROR_ALREADY_EXISTS = 183&

Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
‘Private Const QS_MOUSE& = (QS_MOUSEMOVE _
Or QS_MOUSEBUTTON)
‘Private Const QS_INPUT& = (QS_MOUSE _
Or QS_KEY)
‘Private Const QS_ALLEVENTS& = (QS_INPUT _
Or QS_POSTMESSAGE _
Or QS_TIMER _
Or QS_PAINT _
Or QS_HOTKEY)
Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _
Or QS_PAINT _
Or QS_TIMER _
Or QS_POSTMESSAGE _
Or QS_MOUSEBUTTON _
Or QS_MOUSEMOVE _
Or QS_HOTKEY _
Or QS_KEY)

Private Declare Function CreateWaitableTimer Lib “kernel32” _
Alias “CreateWaitableTimerA” ( _
ByVal lpSemaphoreAttributes As Long, _
ByVal bManualReset As Long, _
ByVal lpName As String) As Long

‘Private Declare Function OpenWaitableTimer Lib “kernel32” _
Alias “OpenWaitableTimerA” ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal lpName As String) As Long

Private Declare Function SetWaitableTimer Lib “kernel32” ( _
ByVal hTimer As Long, _
lpDueTime As FILETIME, _
ByVal lPeriod As Long, _
ByVal pfnCompletionRoutine As Long, _
ByVal lpArgToCompletionRoutine As Long, _
ByVal fResume As Long) As Long

‘Private Declare Function CancelWaitableTimer Lib “kernel32” ( _
ByVal hTimer As Long)

‘Private Declare Function CloseHandle Lib “kernel32” ( _
ByVal hObject As Long) As Long

‘Private Declare Function WaitForSingleObject Lib “kernel32” ( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Private Declare Function MsgWaitForMultipleObjects Lib “user32” ( _
ByVal nCount As Long, _
pHandles As Long, _
ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, _
ByVal dwWakeMask As Long) As Long

Public Sub Wait(dwMilliseconds As Long)
Dim ft As FILETIME
Dim lBusy As Long
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
Dim hTimer As Long
hTimer = CreateWaitableTimer(0, True, App.EXEName & “Timer”)
If Err.LastDllError = ERROR_ALREADY_EXISTS Then
‘ If the timer already exists, it does not hurt to open it
‘ as long as the person who is trying to open it has the
‘ proper access rights.
Else
ft.dwLowDateTime = -1
ft.dwHighDateTime = -1
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, 0)
End If
‘ Convert the Units to nanoseconds.
dblUnits = CDbl(&H10000) * CDbl(&H10000)
dblDelay = CDbl(dwMilliseconds) * 10000
‘ By setting the high/low time to a negative number, it tells
‘ the Wait (in SetWaitableTimer) to use an offset time as
‘ opposed to a hardcoded time. If it were positive, it would
‘ try to convert the value to GMT.
ft.dwHighDateTime = -CLng(dblDelay / dblUnits) – 1
dblDelayLow = -dblUnits * (dblDelay / dblUnits – _
Fix(dblDelay / dblUnits))
If dblDelayLow < CDbl(&H80000000) Then
‘ &H80000000 is MAX_LONG, so you are just making sure
‘ that you don’t overflow when you try to stick it into
‘ the FILETIME structure.
dblDelayLow = dblUnits + dblDelayLow
ft.dwHighDateTime = ft.dwHighDateTime + 1
End If
ft.dwLowDateTime = CLng(dblDelayLow)
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)
Do
‘ QS_ALLINPUT means that MsgWaitForMultipleObjects will
‘ return every time the thread in which it is running gets
‘ a message. If you wanted to handle messages in here you could,
‘ but by calling Doevents you are letting DefWindowProc
‘ do its normal windows message handling—Like DDE, etc.
lBusy = MsgWaitForMultipleObjects(1, hTimer, False, _
INFINITE, QS_ALLINPUT&)
DoEvents
Loop Until lBusy = WAIT_OBJECT_0
‘ Close the handles when you are done with them.
CloseHandle hTimer
End Sub

VBScript 简介

VBS 是一种 Windows 脚本,它的全称是 Microsoft Visual Basic Script Editon( 微软公司可视化 BASIC 脚本版 ) , VBS 是 Visual Basic 的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接由 Windows 系统执行,也就是一个叫做宿主 host 的解释源代码并执行,高效、易学,且大部分高级语言能干的事情,它基本上都具备,它可以使各种各样的任务自动化,可以使你从重复琐碎的工作中解脱出来,极大的提高工作效率。

VBS 脚本可以理解为其实就是一种计算机编程语言,但是由于缺少计算机程序设计语言中的部分要素,对于事件的描述能力较弱,所以称为脚本,它最方便的地方就是提供了对 COM 对象的简便支持。那么什么是 COM 对象呢?

COM 对象就是一些具有特定函数功能项程序模块,他们一般以 ocx 或者 dll 作为扩展名,只要找到包含有所需功能的模块文件,并在脚本中规范的引用,就可以实现特定的功能,也就是说 VBS 脚本就是调用现成的“控件”作为对象,用对象的属性和方法实现目的,完全免去了编写代码、设计算法等等麻烦。说白了,就是利用诸多的黑匣子,前提是了解黑匣子的接口。

最方便的是它甚至不需要专门的开发环境,在计算机中,只要有 notepad ,就可以编写 VBS 脚本了,并且可以直接执行。

一、变量

1 、所有单引号后面的内容都被解释为注释。

2 、在 VBScript 中,变量的命名规则遵循标准的命名规则,需要注意的是:在 VBScript 中对变量、方法、函数和对象的引用是不区分大小写的。在申明变量时,要显式地申明一个变量,需要使用关键字 Dim 来告诉 VBScript 你要创建一个变量,并将变量名称跟在其后。申明多个同类型变量,可以用逗号分隔。注意: VBScript 中不允许在申明变量的时候同时给变量赋值。但是允许在一行代码内同时对两个变量进行赋值,中间用冒号分隔。

3 、你可以使用 Option Explicit 来告诉宿主变量必须先声明后使用。

4 、 VBScript 在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。

CBool 函数将变量转换成布尔值;

CByte 函数将变量转换为 0 到 255 之间的整数;

CCur 函数、 CDbl 函数和 CSng 函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范围也要大的多;

CDate 函数将变量转换为日期值;

CInt 函数和 Clng 函数将变量转换为整数,后者的范围比前者要大的多;

CStr 函数将变量转换为字符串。

二、数组

数组的定义与变量非常类似,只需要在变量后描述这个数组的个数和维数。需要注意的是:数组的下标总是从 0 开始,而以数组定义中数值减一结束。也就是说你以要定义一个有十个数据的数组,将这样书写代码: dim array ( 9 ),同样,当你要访问第五个元素时,实际的代码是 array(4) 。当然,你可以通过不指定数组的个数和维数来申明动态数组。等到数组的个数和维数固定后,使用关键字 redim 来改变数组。注意,在改变数组的大小时,数组的数据会被破坏,使用关键字 preserve 来保护数据。例如:Redim 空格 preserve 空格 array 括号个数逗号维数括号

三、操作符

在 VBScript 运算符中,加减乘除都是我们常用的符号,乘方使用的是 ^ ,取模使用的 Mod 。

在比较操作符中,等于、小于、大于、小于等于、大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用。

逻辑运算符为:和操作— >AND 非操作— >NOT 或操作— >OR ;

你可以使用操作符 + 和操作符 & 来连接字符串,一般使用 & 操作符;

另外还有一个比较特殊的操作符 Is 用来比较对象,例如按钮对象,如果对象是同一类型,结果就是真,如果对象不是同一类型,结果就是假。

四、条件语句主要有 if …… then 语句和 select case 语句两种形式

在 if …… then 语句中,其基本形式为:

If 条件 then

‘处理条件的语句

Else

‘处理不满足条件的语句

Endif

如果还有更多的条件需要验证,则需要添加语句

Elseif 条件 then

‘处理条件语句

在 select case 语句中,其基本形式为:

Select case 变量

Case 条件值一

‘处理条件一语句

Case 条件值二

‘处理条件二语句

case else

‘处理语句

End select

注意:在执行字符串比较时,需要特别注意大小写,一般情况下,我们在比较前,使用 lcase 函数将字符串转换成小写,使用 ucase 函数将字符串转换成大写。

五、循环控制语句

循环控制语句有 for …… next 循环、 for …… each 循环、 do …… while 循环、 do …… until 循环、 while 循环五种形式。

在使用循环控制语句前,首先要对循环条件进行判断,如果循环次数是有固定次数的,那么使用 For …… next 循环,其结构为:

For 计数器变量=开始计数值 to 最后计数值

‘执行循环体

Next

如果是需要对数组或对象集合中的每一个元素进行判断,则需要使用 for …… each 循环,其结构为:

For each 循环计数变量 in 要查看的对象或数组

‘执行处理语句

Next

注意:在上述两种循环中随时可以使用 exit for 来退出循环。

如果你希望在条件满足时执行一段代码则使用 do …… while 语句,结构为:

Do while 条件

‘执行循环体

Loop

如果你希望在条件不满足时执行代码,则使用 do …… until 语句,结构为:

Do   until  条件

‘执行循环体

Loop

当然,在这两种循环语句中,你可以使用 exit do 来退出循环

最后一种循环语句是条件满足时一直执行循环,

While 条件

‘执行循环体

Wend

六、使用过程

常用的过程有两种,一种为函数,给调用者返回值,一种为子程序,无返回值,还有一种叫事件的特殊子程序,用的比较少。

函数的基本定义方法为:

Function 函数名称(参数列表)

‘函数代码

‘函数名称=某值 ‘用来返回值

end function

子程序类似,不过没有返回值。

注意:尽管在定义子程序的时候,参数列表要加括号,但在调用子程序的时候,参数列表不加括号,括号只在函数中使用。另外,子程序不能在表达式中使用。

而函数只能出现在赋值语句的右边,或者表达式中,函数不能直接使用,如果必须直接使用函数,则必须使用 call 语句调用,并取消返回值。

文件系统对象(File System Object)

一、简   

 文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法。通过采用object.method这种在面向对象编程中广泛使用的语法,将一系列操作文件和文件夹的动作通过调用对象本身的属性直接实现。

FSO 对象模型不仅可以象使用传统文件操作语句那样实现文件的创建、改变、移动和删除,而且可以检测是否存在指定的文件夹,如果存在,那么,这个文件夹又位于磁盘上的什么位置。更令人高兴的是FSO 对象模型还可以获取关于文件和文件夹的信息,如名称、创建日期或最近修改日期等以及当前系统中使用的驱动器的信息,如驱动器的种类是CD-ROM还是可移动磁盘,当前磁盘的剩余空间还有多少。而以前要获取这些信息必须通过调用Windows API函数集中的相应函数才能实现。

FSO对象模型包含在Scripting 类型库 (Scrrun.Dll)中,它同时包含了DriveFolderFileFileSystemObjectTextStream五个对象。其中Drive用来收集驱动器的信息,如可用磁盘空间或驱动器的类型;Folder用于创建、删除或移动文件夹,同时可以进行向系统查询文件夹的路径等操作;File的基本操作和Folder基本相同,所不同的是Files的操作主要是针对磁盘上的文件进行的;FileSystemObject是FSO对象模型中最主要对象,它提供了一套完整的可用于创建、删除文件和文件夹,收集驱动器、文件夹、文件相关信息的方法。需要注意的是,FSO对象模型提供的方法是冗余的,也就是说在实际使用中,FSO对象模型中包含的不同对象的不同方法进行的却是同样的操作,而且FileSystemObject对象的方法直接作用于其余对象,所以在后面的文章中并没有单独提到FileSystemObject对象,千万不要以为没有提到就不重要,事实上FileSystemObject对象在整个FSO对象模型中无处不在;最后的TextStream对象则是用来完成对文件的读写操作的。

创建FSO对象模型:

由于FSO对象包含在Scripting 类型库 (Scrrun.Dll)中,所以在使用前首先需要在在工程中引用这个文件,单击“工程”,“引用”,然后在“引用”对话框中选中“Microsoft Scripting Runtime”前的复选框,然后单击“确定”。

要创建FSO对象可以采用两种方法,一种是将一个变量声明为FSO对象类型:Dim fsoTest As New FileSystemObject;另一种是通过CreateObject方法创建一个FSO 对象:Set fsoTest = CreateObject(“Scripting.FileSystemObject”)。在实际使用中具体采用哪种声明方法,可根据个人的使用习惯而定。

完成了FSO对象模型的创建之后,就可以利用创建的对象模型的方法访问下属各个对象的属性来获取所需信息或进行相关操作了

FileSystemObject对象有许多用来操作文件系统的方法和属性。

 二、FileSystemObject中的对象的方法和属性

(一)FSO对象

属性:

1Drives属性

Drives属性是FileSystemObject对象唯一的属性,返回对硬盘驱动器集合(Drives)的引用,是一个只读属性。其语法为:

oFileSysObj.Drives

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。

Drives属性返回的集合中的每个成员都是Drive对象,表示系统中一个可用的驱动器。可以使用For … Next循环迭代系统中所有驱动器,或者使用Drives集合的Item方法读取某个Drive对象(代表系统中的某个驱动器)。

 方法:

1BuildPath方法

其语法为:

oFileSysObj.BuildPath (Path,Name)

其中,oFileSysObj为任何能够返回FileSystemObject对象的对象变量。参数Path必需,指定驱动器或文件夹路径,String类型,可以是绝对路径也可以是相对路径,不一定要包含驱动器名。参数Name必需,指定附加在Path后的文件夹或文件路径,String类型。参数Path或Name都不一定要求是当前已经存在的路径或文件夹。

BuildPath方法通过合并参数Path和文件夹或文件名生成一个字符串,并且在必要的地方加上正确的主机系统路径分隔符。该方法不能检验新的文件夹或文件名的有效性。

与人工合并两个字符串相比,使用BuildPath函数的惟一好处就是它能够选择正确的路径分隔符。

2FileExists方法

FileExists方法用于判断指定的文件是否存在,若存在则返回True。其语法为:

oFileSysObj.FileExists(FileSpec)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象。参数FileSpec必需,代表文件的完整路径,String类型,不能包含有通配符。

如果用户有充分的权限,FileSpec可以是网络路径或共享名,例如:

If ofs.FileExists(“\\TestPath\Test.txt”) Then XXX

3GetFile方法

GetFile方法用来返回一个File对象。其语法为:

oFileSysObj.GetFile (FilePath)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数FilePath必需,指定路径和文件名,String类型。可以是绝对路径或相对路径。如果FilePath是一个共享名或网络路径,GetFile确认该驱动器或共享是File对象创建进程的一部分。如果参数FilePath指定的路径的任何部分不能连接或不存在,就会产生错误。

GetFile方法返回的是File对象,而不是TextStream对象。File对象不是打开的文件,主要是用来完成如复制或移动文件和询问文件的属性之类的方法。尽管不能对File对象进行写或读操作,但可以使用File对象的OpenAsTextStream方法获得TextStream对象。

要获得所需的FilePath字符串,首先应该使用GetAbsolutePathName方法。如果FilePath包含网络驱动器或共享,可以在调用GetFile方法之前用DriveExists方法来检验所需的驱动器是否可用。

因为在FilePath指定的文件不存在时会产生错误,所以应该在调用GetFile之前调用FileExists方法确定文件是否存在。

必须用Set语句将File对象赋给一个局部对象变量。

4GetFileName方法

GetFileName方法返回给定路径的文件名称部分。其语法为:

oFileSysObj.GetFileName (Path)

其中,oFileSysObj表示任何能够返回FileSystemObject对象的对象变量。参数Path必需,指定路径说明,String类型。如果不能从给定的Path确定文件名,则返回一个零长字符串(””)。Path可以为绝对路径或相对路径。

GetFileName方法不能检验Path中是否存在指定的文件。Path可以为网络驱动器或共享。GetFileName本身不具有智能,它认为字符串中不属于驱动器说明的最后部分就是一个文件名,更像是一个字符串处理函数而不是对象处理方法。

5GetFileVersion方法

GetFileVersion方法返回文件的版本。

6CopyFile方法

CopyFile方法用来复制文件,将文件从一个文件夹复制到另一个文件夹。其语法为:

oFileSysObj.CopyFile Source,Destination [,OverwriteFiles]

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Source必需,指定要复制的文件的路径和名称,String类型。参数Destination必需,代表复制文件的目标路径和文件名(可选),String类型。参数OverwriteFiles可选,表示是否覆盖一个现有文件的标志,True表示覆盖,False表示不覆盖,Boolean类型,默认值为True。

参数source中源路径可以是绝对路径或相对路径,源文件名可包含通配符但源路径不能。在参数Destination中不能包含通配符。

如果目标路径或文件设置为只读,则无论OverwriteFiles参数的值如何,都将无法完成CopyFile方法。如果参数OverwriteFiles设置为False且Destination指定的文件已经存在,则会产生一个运行时错误“文件已经存在”。如果在复制多个文件时出现错误,CopyFile方法将立即停止复制操作,该方法不具有撤销错误前文件复制操作的返回功能。如果用户有充分的权限,那么source或destination可以是网络路径或共享名,例如:

CopyFile “\\NTSERV1\RootTest\test.txt”,”C:\RootOne”

CopyFile方法可以复制一个保存在特定文件夹中的文件。如果文件夹本身有包含文件的子文件夹,则使用CopyFile方法不能复制这些文件,应该使用CopyFolder方法。

例如:

7CreateTextFile方法

CreateTextFile方法创建一个新的文件并返回其TextStream对象,其语法为:

oFileSysObj.CreateTextFile Filename [,Overwrite[,Unicode]]

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Filename必需,代表任何有效文件名,String类型。在Filename中不允许使用通配符。Filename可以是相对路径也可以是绝对路径,如果没有指定路径,则使用应用程序的当前驱动器或文件夹作为路径。如果指定的路径不存在,则该方法将失败。

参数Overwrite可选,作为一个标志,指定是否覆盖一个具有相同文件名的现有文件,Boolean类型。默认值为False。

参数Unicode可选,作为一个标志,指明用Unicode格式还是ASCⅡ格式写文件,Boolean类型。如果设置为True,则以Unicode格式创建文件,否则创建一个ASCⅡ文本文件。默认值为False。

只有写操作才能使新创建的文本文件自动打开,如果以后希望读取该文件,则必须选关闭它再以读模式重新打开该文件。

如果参数Filename中指定的路径设置为只读,则不论参数Overwrite的值如保,CreateTextFile方法都将失败。

如果用户有充分的权限,那么参数Filename可以是网络路径或共享名,例如:

CreateTextFile “\\NTSERV1\RootTest\myFile.doc”

必须使用Set语句将TextStream对象赋值给局部对象变量。

8MoveFile方法

MoveFile方法用来移动文件,将文件从一个文件夹移动到另一个文件夹。其语法为:

oFileSysObj.MoveFile source,destination

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数source必需,指定要移动的文件的路径,String类型。参数destination必需,指定文件移动操作中的目标位置的路径,String类型。

如果Source包含通配符或者destination以路径分隔符结尾,则认为destination是一个路径,否则认为destination的最后一部分是文件名。

如果目标文件已经存在,则将出现一个错误。

source可以包含通配符,但只能出现在它的最后一部分中。

destination参数不能包含通配符。

source或destination可以是相对路径或绝对路径,可以是网络路径或共享名。

MoveFile方法在开始操作前先解析source和destination这两个参数。

9DeleteFile方法

DeleteFile方法删除指定的一个或多个文件。其语法为:

oFileSysObj.DeleteFile FileSpec[,Force]

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数FileSpec必需,代表要删除的单个文件或多个文件的名称和路径,String类型,可以在路径的最后部分包含通配符,可以为相对路径或绝对路径。如果在FileSpec中只有文件名,则认为该文件在应用程序的当前驱动器和文件夹中。参数Force可选,如果将其设置为True,则忽略文件的只读标志并删除该文件,Boolean类型,默认值为False。

如果指定要删除的文件已经打开,该方法将失败并出现一个“Permission Denied”错误。如果找不到指定的文件,则该方法失败。

如果在删除多个文件的过程中出现错误,DeleteFile方法将立即停止删除操作,即不能删除余下的文件部分。该方法不具有撤销产生错误前文件删除操作的返回功能。

如果用户有充分的权限,源路径或目标路径可以是网络路径或共享名。例如:

DeleteFile “\\NTSERV1\RootTest\MyFile.doc”

DeleteFile方法永久性地删除文件,并不把这些文件移到回收站中。

10DriveExists方法

DriveExists方法用来判断在本地计算机或者网络上是否存在指定的磁盘,若存在则返回True。其语法为:

oFileSysObj.DriveExists (DriveSpec)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数DriveSpec必需,代表路径或驱动器名,String类型。如果DriveSpec是一个Windows驱动器名,则其后面不需要跟冒号,例如“C”和“C:”是一样的。

DriveExists方法不能返回可移动驱动器的当前状态,要实现这一目的,必须使用指定驱动器的IsReady属性。

如果用户有充分的权限,DriveSpec可以是网络路径或共享名,例如:

If ofs.DriveExists(“\\NTESERV1\d$”) Then

在调用位于某驱动器上一个远程ActiveX服务器中的函数前,最好先使用DriveExists方法检测网络上是否存在该驱动器。

11GetDrive方法

GetDrive方法返回Drive对象,即获得对指定驱动器的Drive对象的引用。其语法为:

oFileSysObj.GetDrive (drivespecifier)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数drivespecifier必需,代表驱动器名、共享名或网络路径,String类型。如果drivespecifier是一个共享名或网络路径,GetDrive确认它是Drive对象创建进程的一部分,否则会产生运行时错误“找不到路径”。如果指定的驱动器没有连接上或者不存在,则会出现运行时错误“设备不可用”。

如果要从路径中导出drivespecifier字符串,应该首先用GetAbsolutePathName来确保驱动器是路径的一部分,然后在调用GetDriveName从全限定路径中提取出驱动器之前,用FolderExists方法检验路径是否有效。

如果driverspecifier是一个网络驱动器或共享,在调用GetDrive方法之前,应该用DriveExists方法检验所需的驱动器是否可用。

必须用Set语句将Drive对象赋给局部对象变量。

12GetDriveName方法

GetDriveName方法返回一个包含硬盘名称或者网络共享名称的字符串。即返回给定路径的驱动器名,如果从给定的路径中不能确定驱动器名,则返回一个零长字符串(””)。其语法为:

oFileSysObj.GetDriveName (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,指定路径,String类型。

GetDriveName不能检验Path中是否存在指定的驱动器。Path可以是网络驱动器或共享。

13GetExtensionName方法

返回给定路径中文件的扩展名。其语法为:

oFileSysObj.GetExtensionName (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,表示路径说明,String类型。如果不能确定Path中的扩展名,则返回一个零长字符串。

GetExtensionName方法不能检验Path是否有效,Path可以为网络路径或共享。GetExtensionName没有智能功能,它简单地解析一个字符串,并返回Path最后部分中最后一个点后的文本。

14FolderExists方法

FolderExists方法可以判断指定的文件夹是否存在,若存在则返回True。其语法为:

oFileSysObj.FolderExists(FolderSpec)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数FolderSpec指定文件夹的完整路径,String类型,不能包含通配符。

如果用户有充分的权限,FolderSpec可以是网络路径或共享名,例如:

If ofs.FileExists (“\\NTSERV1\d$\TestPath\”) Then XXX

15GetAbsolutePathName方法

将相对路径转变为一个全限定路径(包括驱动器名),返回一个字符串,包含一个给定的路径说明的绝对路径。其语法为:

oFileSysObj.GetAbsolutePathName (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,代表路径说明,String类型。

“.”返回当前文件夹的驱动器名和完整路径。“..”返回当前文件夹的父文件夹的驱动器名和路径。“filename”返回当前文件夹中的文件的驱动器名、路径及文件名。

所有相对路径名均以当前文件夹为基准。

如果没有明确地提供驱动器作为Path的一部分,就以当前驱动器作为Path参数中的驱动器。在Path中可以包含任意个通配符。

对于映射网络驱动器和共享而言,这种方法不能返回完整的网络地址,而是返回全限定的本地路径和本地驱动器名。

GetAbsolutePathName不能检验指定路径中是否存在某个给定的文件或文件夹。

16GetBaseName方法

返回路径的最后部分的名称,不包含扩展名。其语法为:

oFileSysObj.GetBaseName (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,代表路径说明,String类型。Path中最后部分的文件扩展名不包含在返回的字符串中。

GetBaseName方法不能检验Path中是否存在给定的文件或文件夹。GetBaseName方法没有舍去文件扩展名并返回Path的基本名称的智能功能。也就是说,它不能识别路径的最后部分是路径还是文件名。如果最后部分包括一个或多个点“.”,它仅仅删除最后一个占以及该点后的文本。所以如果Path为“.”,GetBaseName方法返回一个空字符串;如果Path为“..”,GetBaseName方法返回“.”。换句话说,它只不过是一个字符串处理函数,而不是一个文件函数。

17GetFolder方法

GetFolder方法返回Folder对象。其语法为:

oFileSysObj.GetFolder (FolderPath)

其中,oFileSysObj代表任何能返回FileSystemObject对象的对象变量。参数FolderPath必需,指定所需文件夹的路径,String类型,可以为相对路径或绝对路径。如果FolderPath是共享名或网络路径,GetFolder确认该驱动器或共享是File对象创建进程的一部分。如果FolderPath的任何部分不能连接或不存在,就会产生一个错误。

要获得所需的Path字符串,首先应该使用GetAbsolutePathName方法。如果FolderPath包含一个网络驱动器或共享,可以在调用GetFolder方法之前使用DriveExists方法确认指定的驱动器是否可用。由于GetFolder方法要求FolderPath是一个有效文件夹的路径,所以应调用FolderExists方法来检验FolderPath是否存在。

必须使用Set语句将Folder对象赋给一个局部对象变量。

18GetParentFolderName方法

返回给定路径中最后部分前的文件夹名,其语法为:

oFileSysObj.GetParentFolderName (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,指定路径说明,String类型。

如果从Path中不能确定父文件夹名,就返回一个零长字符串(””)。Path可以为相对路径或绝对路径。可以是网络驱动器或共享。

GetParentFolderName方法不能检验Path的某个部分是否存在。

GetParentFolderName方法认为Path中不属于驱动器说明的那部分字符串除了最后一部分外余下的字符串就是父文件夹。除此之外它不做任何其他检测,更像是一个字符串解析和处理例程而不是与对象处理有关的例程。

19GetSpecialFolder方法

GetSpecialFolder方法返回操作系统文件夹路径,其中0代表Windows文件夹,1代表System(系统)文件夹,2代表Temp(临时)文件夹。其语法为:

oFileSysObj.GetSpecialFolder (SpecialFolder)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数SpecialFolder必需,为特殊的文件夹常数,表示三种特殊系统文件夹中其中一个的值。

可以使用Set语句将Folder对象赋给一个局部对象变量,但是如果只对检索特殊的文件夹感兴趣,就可以使用下列语句来实现:

sPath=oFileSys.GetSpecialFolder (iFolderConst)

或:

sPath=oFileSys.GetSpecialFolder (iFolderConst).Path

由于Path属性是Folder对象的缺省属性,所认第一个语句有效。因为不是给一个对象变量赋值,所以赋给sPath的值是缺省的Path属性值,而不是对象引用。

20GetTempName方法

返回系统创建的一个临时文件或文件夹名。其语法为:

oFileSysObj.GetTempName

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。

GetTempName方法不能创建临时文件或文件夹,它仅仅提供一个可用于CreateTextFile方法的文件或文件夹名。

一般来说,不必创建自已的临时文件名。Windows在Windows API中提供了一种算法来创建特殊的临时文件或文件夹名,这样Windows才能识别它们。GetTempName很好地包装了GetTempFilename API函数。

21CreateFolder方法

CreateFolder方法用于在指定的路径下创建一个新文件夹,并返回其Folder对象。其语法为:

oFileSysObj.CreateFolder (Path)

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Path必需,为一个返回要创建的新文件夹名的表达式,String类型。Path指定的路径可以是相对路径也可以是绝对路径,如果没有指定路径则使用当前驱动器和目录作为路径。在新的文件夹名中不能使用通配符。

如果参数Path指定的路径为只读,则CreateFolder方法将失败;如果参数Path指定的文件夹已经存在,就会产生运行时错误“文件已经存在”。如果用户有充分的权限,则参数Path可以指定为网络路径或共享名,例如:

CreateFolder “\\NTSERV1\RootTest\newFolder”

在实际使用时,必须使用Set语句将Folder对象赋给对象变量。

22CopyFolder方法

CopyFolder方法用于复制文件夹,即将一个文件夹的内容(包括其子文件夹)复制到其他位置。其语法为:

oFileSysObj.CopyFolder Source,Destination[,OverwriteFiles]

其中,参数oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Source必需,指定要复制的文件夹的路径和文件夹名,String类型,必须使用通配符或者非路径分隔符来结束。参数Destination必需,指定文件夹复制操作的目标文件夹的路径,String类型。参数OverwriteFiles可选,表示是否被覆盖一个现有文件的标志,True表示覆盖,False表示不覆盖,Boolean类型。

通配符只能在参数Source中使用,但是只能放在最后的组件中。在参数Destination中不能使用通配符。

除非不允许使用通配符,否则就可以把源文件夹中的所有子文件夹和文件都复制到Destination指定的文件夹中,也就是说CopyFolder方法是递归的。

如果参数Destination以一个路径分隔符结束或者参数Source以一个通配符结束,CopyFolder方法就认为参数Source中的指定的文件夹存在于参数Destination中,否则就创建这样一个文件夹。

 如果参数Destination指定的目标路径或任意文件被设置成只读属性,则不论OverwriteFiles的值如何,CopyFolder方法者将失效。

如果OverwriterFiles设置为False,而参数Source指定的源文件夹或任何文件存在于参数Destination中,将产生运行时错误“文件已经存在”。

如果在复制多个文件夹时出现错误,CopyFolder方法立即停止复制操作,不再复制余下要复制的文件。该方法不具有撤销产生错误前文件复制操作的返回功能。

如果用户有充分的权限,source或destination都可以是网络路径或共享名,例如:

CopyFolder “C:\Rootone”,”\\NTSERV1\d$\RootTwo\”

23MoveFolder方法

MoveFolder方法用来移动文件夹,将文件夹及其文件和子文件夹一起从某个位置移动到另一个位置。其语法为:

oFileSysObj.MoveFolder source,destination

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数Source指定要移动的文件夹的路径,String类型。参数destination指定文件夹移动操作中目标位置的路径,String类型。

Source必须以通配符或非路径分隔符结束,可以使用通配符,但必须出现在最后一部分中。destination不能使用通配符。除非不允许使用通配符,否则源文件夹中所有的子文件夹和文件都被复制到destination指定的位置,也就是说MoveFolder方法是递归的。

如果destination用路径分隔符结束或者source用通配符结束,MoveFolder就认为source中指定的文件夹存在于destination中。

Source和destination可以为绝对路径或相对路径,可以为网络路径或共享名。

MoveFile方法在开始操作前先解析source和destination这两个参数。

24DeleteFolder方法

DeleteFolder方法用于删除指定的文件夹及其所有的文件和子文件夹。其语法为:

oFileSysObj.DeleteFolder FileSpec[,Force]

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数FileSpec必需,指定要删除的文件夹的名称和路径,String类型。在参数FileSpec中,可以在路径的最后部分包含通配符,但不能用路径分隔符结束,可以为相对路径或绝对路径。

参数Force可选,Boolean类型,如果设置为True,将忽略文件的只读标志并删除这个文件。默认为False。如果参数Force设置为False并且文件夹中的任意一个文件为只读,则该方法将失败。如果找不到指定的文件夹,则该方法失败。

如果指定的文件夹中有文件已经打开,则不能完成删除操作,且产生一个“Permisson Denied”错误。DeleteFolder方法删除指定文件夹中的所有内容,包括其他文件夹及其内容。

如果在删除多个文件或文件夹时出现错误,DeleteFolder方法将立即停止删除操作,即不能删除余下的文件夹或文件。该方法不具有撤销产生错误前文件夹删除操作的返回功能。

DeleteFolder方法永久性删除文件夹,并不把它们移到回收站中。

如果用户有充分的权限,源路径和目标路径可以是网络路径或共享名,例如:

DeleteFolder “\\RootTest”

25OpenTextFile方法

OpenTextFile方法用于打开(或创建)文本文件以进行读取或写入操作,返回一个TextStream对象。其语法为:

oFileSysObj.OpenTextFile (FileName[,IOMode[,Create[,Format]]])

其中,oFileSysObj代表任何能够返回FileSystemObject对象的对象变量。参数FileName必需,指定要打开的文件的路径和文件名,String类型,FileName的路径部分可为相对路径或绝对路径。参数IOMode可选,指定文件打开模式的一个常数(参见前文的表格),默认设置为ForReading(1)。参数Create可选,一个Boolean型标志,说明如果在给定的路径中找不到文件,是否应该创建该文件。参数Format可选,一个Tristate常数(参见前文的表格),指定打开文件的格式为ASCⅡ或Unicode格式,默认设置为ASCⅡ(False)。

如果另一个进程已经打开了指定文件,该方法将失败,并产生一个“Permission Denied”错误。

要保证OpenTextFile方法成功执行,可以在调用它之前使用GetAbsolutePath和FileExists方法。

IOMode的值只能是一个常量值,例如,下面的方法调用:

lMode=ForReading or ForWritingoFileSys.OpenTextStream(strFileName,lMode) ‘错误

将产生运行时错误“无效的过程调用或参数”。

如果用户有充分的权限,FileName的路径部分可以是网络路径或共享名,例如:

OpenTextFile “\\NTSERV1\d$\RootTwo\myFile.txt”

(二)Drive对象

上面已经提到Drive对象是用来获取当前系统中各个驱动器的信息的。由于Drive对象没有方法,其应用都是通过属性表现出来的,所以我们必须熟悉Drive对象的属性:

AvailableSpace:返回在指定的驱动器或网络共享上的用户可用的空间容量。

DriveLetter :返回某个指定本地驱动器或网络驱动器的字母,这个属性是只读的。

DriveType:返回指定驱动器的磁盘类型。

FileSystem: 返回指定驱动器使用的文件系统类型。

FreeSpace:返回指定驱动器上或共享驱动器可用的磁盘空间,这个属性是只读的。

IsReady:确定指定的驱动器是否准备好。

Path :返回指定文件、文件夹、或驱动器的路径。

RootFolder :返回一个 Folder 对象,该对象表示一个指定驱动器的根文件夹。只读属性。

SerialNumber:返回用于唯一标识磁盘卷标的十进制序列号。

ShareName:返回指定驱动器的网络共享名

TotalSize :以字节为单位,返回驱动器或网络共享的总空间大小。

VolumeName :设置或返回指定驱动器的卷标名。

从上面的属性可以看到Drive对象基本上包含了日常操作所需的全部的驱动器信息,因此在使用中是非常方便的。

(三)Folder对象

在FSO 对象模型中,提供了丰富的有关文件夹操作的方法,这些方法分别是:

FileSystemObject对象中有关文件夹的方法:

CreateFolder :创建一个文件夹 。

DeleteFolder:删除一个文件夹 。

MoveFolder :移动一个文件夹 。

CopyFolder:复制一个文件夹 。

FolderExists: 查找一个文件夹是否在驱动器上 。

GetFolder :获得已有Folder对象的一个实例 。

GetParentFolderName: 找出一个文件夹的父文件夹的名称。

GetSpecialFolder: 找出系统文件夹的路径。

Folder对象的方法:

Delete :创建一个文件夹 。

Move :移动一个文件夹 。

Copy:复制一个文件夹。

Name:检索文件夹的名称。

在此需要强调一点,前面我们曾经提到过FSO对象模型包含的方法是冗余的,所以Folder对象的Delete、Move、Copy方法和FileSystemObject对象的DeleteFolder、MoveFolder、CopyFolder方法实际上是相同的,因此在实际使用中可以任选其中的一种。

(四)File对象和TextStream对象

由于有关File对象的复制,删除,移动等操作和Folder对象类似,所以这部分内容就不再重复。这里主要讲述利用File对象和TextStream对象操作文本文件。

通常对文本文件的操作包括在文本文件中创建数据,在文本文件中添加数据,删除文本文件的数据等操作。这些操作都可以通过File对象和FileSystemObject对象的相关方法完成。不过在使用之前,首先要创建一个文本文件,当然可以通过使用FileSystemObject对象的 CreateTextFile 方法来完成。

AutoCAD 的图纸 DXF 组码

-1 = 图元名称 (Entity Name)0 = 图元类型 (Entity Type)
5 = 图元句柄 (Handle)6 = 线型 (Line Type)
8 = 图层名称 (Layer Name)48 = 线型比例 (Line Type Scale)
62 = 颜色号码 (Color Number)67 = 绘图空间 (1 = 图纸空间)


弧 (ARC)

10 = 圆心点40 = 半径50 = 起点角度51 = 终点角度


圆 (CIRCLE)

10 = 圆心点40 = 半径  


注标 (DIMENSION)

1 = 注标文字2 = 图块名称3 = 文字字型10 = 定义点坐标
11 = 文字中间点坐标13 = 第1定义点坐标14 = 第2定义点坐标15 = 第3定义点坐标
50 = 注标线旋转角度53 = 文字旋转角度70 = 注标形式 

(0=线性 1=对齐式 2=角度 3=直径 4=半径 6=坐标式 70=坐标式 128=文字巳被修改)
椭圆 (ELLIPSE)

10 = 圆心点11 = 长轴端点相对于圆心的相对坐标40 = 长短轴百份比
41 = 椭圆弧起点角度42 = 椭圆弧终点角度 


填涂 (HATCH)

2 = 图样名称41 = 填涂比例5 = 角度71 = 是否为关系型

插入图块 (INSERT)

2 = 图块名称10 = 插入点41 = X方向比例42 = Y方向比例
43 = Z方向比例44 = 行间距45 = 列间距50 = 旋转角度
70 = 行数量72 = 列数量  


引线 (LEADER)

3 = 形式名称7 = 字型10 = 箭头起点坐标40 = 文字高度
41 = 文字宽度76 = 引线顶点数目  

73 = 文字字型 (0=一般  1=公差  2=图块  3=没有)
线 (LINE)

10 = 起点11 = 终点  


细聚合线 (LWPOLYLINE)

10 = 顶点坐标40 = 区段起点宽度11 = 区段终点宽度
42 = 弯曲系数(即凸度,直线为0)43 = 是否单一线宽70 = 断续线模式
90 = 顶点数目  


(SOLID)

10 = 第1点坐标11 = 第2点坐标12 = 第3点坐标14 = 第4点坐标


文字 (TEXT)

1 = 文字内容7 = 字型10 = 插入点11 = 对齐点
40 = 文字高度50 = 旋转角度41 = X方向比例系数51 = 倾斜角度

71 = 显示模式 (1=正常  2=左右颠倒  3=上下颠倒)
72 = 水平对齐模式 (0=靠左  1=中央  2=靠右  3=Align  4=Middle  5=Fit)
73 = 垂直对齐模式 (0=基线  1=底部  2=中央  3=顶部)

非图形常用DXF群码
共享DXF群码

-1 = 图元名称0 = 图元类型5 = 图元句柄70 = 位旗标


图块 (BLOCK)

1 = 外部参考路径2 = 图块名称10 = 插入点70 = 旗标

(1=匿名  2=外部从属  4=外部参考  16=巳并入外部参考 32=巳贴附外部参考  64=巳参考)
图层 (LAYER)

2 = 图层名称6 = 线型名称62 = 颜色号号70 = 旗标 (1=冻结  4=锁护)


线型 (LINETYPE)

2 = 线型名称3 = 描述文句40 = 图样总长度73 =图样元素数目

74 = 模式 (0=一般  2=包含文字  4=包含造形)
文字样式 (STYLE)

2 = 样式名称3 = 英文字檔名4 = 大字体文件名42 = 宽度系数
50 = 倾斜角度   
40 = 高度模式 (0=指定  1=不指定)71 = 显示模式 (0=正常  2=左右颠倒  4=上下颠倒


用户坐标系 (UCS)

2 = UCS名称10 = 原点坐标(WCS)11 = X轴方向(WCS)12 = Y轴方向(WCS)