- •Using Your Sybex Electronic Book
- •Acknowledgments
- •Contents at a Glance
- •Introduction
- •Who Should Read This Book?
- •How About the Advanced Topics?
- •The Structure of the Book
- •How to Reach the Author
- •The Integrated Development Environment
- •The Start Page
- •Project Types
- •Your First VB Application
- •Making the Application More Robust
- •Making the Application More User-Friendly
- •The IDE Components
- •The IDE Menu
- •The Toolbox Window
- •The Solution Explorer
- •The Properties Window
- •The Output Window
- •The Command Window
- •The Task List Window
- •Environment Options
- •A Few Common Properties
- •A Few Common Events
- •A Few Common Methods
- •Building a Console Application
- •Summary
- •Building a Loan Calculator
- •How the Loan Application Works
- •Designing the User Interface
- •Programming the Loan Application
- •Validating the Data
- •Building a Math Calculator
- •Designing the User Interface
- •Programming the MathCalculator App
- •Adding More Features
- •Exception Handling
- •Taking the LoanCalculator to the Web
- •Working with Multiple Forms
- •Working with Multiple Projects
- •Executable Files
- •Distributing an Application
- •VB.NET at Work: Creating a Windows Installer
- •Finishing the Windows Installer
- •Running the Windows Installer
- •Verifying the Installation
- •Summary
- •Variables
- •Declaring Variables
- •Types of Variables
- •Converting Variable Types
- •User-Defined Data Types
- •Examining Variable Types
- •Why Declare Variables?
- •A Variable’s Scope
- •The Lifetime of a Variable
- •Constants
- •Arrays
- •Declaring Arrays
- •Initializing Arrays
- •Array Limits
- •Multidimensional Arrays
- •Dynamic Arrays
- •Arrays of Arrays
- •Variables as Objects
- •So, What’s an Object?
- •Formatting Numbers
- •Formatting Dates
- •Flow-Control Statements
- •Test Structures
- •Loop Structures
- •Nested Control Structures
- •The Exit Statement
- •Summary
- •Modular Coding
- •Subroutines
- •Functions
- •Arguments
- •Argument-Passing Mechanisms
- •Event-Handler Arguments
- •Passing an Unknown Number of Arguments
- •Named Arguments
- •More Types of Function Return Values
- •Overloading Functions
- •Summary
- •The Appearance of Forms
- •Properties of the Form Control
- •Placing Controls on Forms
- •Setting the TabOrder
- •VB.NET at Work: The Contacts Project
- •Anchoring and Docking
- •Loading and Showing Forms
- •The Startup Form
- •Controlling One Form from within Another
- •Forms vs. Dialog Boxes
- •VB.NET at Work: The MultipleForms Project
- •Designing Menus
- •The Menu Editor
- •Manipulating Menus at Runtime
- •Building Dynamic Forms at Runtime
- •The Form.Controls Collection
- •VB.NET at Work: The DynamicForm Project
- •Creating Event Handlers at Runtime
- •Summary
- •The TextBox Control
- •Basic Properties
- •Text-Manipulation Properties
- •Text-Selection Properties
- •Text-Selection Methods
- •Undoing Edits
- •VB.NET at Work: The TextPad Project
- •Capturing Keystrokes
- •The ListBox, CheckedListBox, and ComboBox Controls
- •Basic Properties
- •The Items Collection
- •VB.NET at Work: The ListDemo Project
- •Searching
- •The ComboBox Control
- •The ScrollBar and TrackBar Controls
- •The ScrollBar Control
- •The TrackBar Control
- •Summary
- •The Common Dialog Controls
- •Using the Common Dialog Controls
- •The Color Dialog Box
- •The Font Dialog Box
- •The Open and Save As Dialog Boxes
- •The Print Dialog Box
- •The RichTextBox Control
- •The RTF Language
- •Methods
- •Advanced Editing Features
- •Cutting and Pasting
- •Searching in a RichTextBox Control
- •Formatting URLs
- •VB.NET at Work: The RTFPad Project
- •Summary
- •What Is a Class?
- •Building the Minimal Class
- •Adding Code to the Minimal Class
- •Property Procedures
- •Customizing Default Members
- •Custom Enumerations
- •Using the SimpleClass in Other Projects
- •Firing Events
- •Shared Properties
- •Parsing a Filename String
- •Reusing the StringTools Class
- •Encapsulation and Abstraction
- •Inheritance
- •Inheriting Existing Classes
- •Polymorphism
- •The Shape Class
- •Object Constructors and Destructors
- •Instance and Shared Methods
- •Who Can Inherit What?
- •Parent Class Keywords
- •Derived Class Keyword
- •Parent Class Member Keywords
- •Derived Class Member Keyword
- •MyBase and MyClass
- •Summary
- •On Designing Windows Controls
- •Enhancing Existing Controls
- •Building the FocusedTextBox Control
- •Building Compound Controls
- •VB.NET at Work: The ColorEdit Control
- •VB.NET at Work: The Label3D Control
- •Raising Events
- •Using the Custom Control in Other Projects
- •VB.NET at Work: The Alarm Control
- •Designing Irregularly Shaped Controls
- •Designing Owner-Drawn Menus
- •Designing Owner-Drawn ListBox Controls
- •Using ActiveX Controls
- •Summary
- •Programming Word
- •Objects That Represent Text
- •The Documents Collection and the Document Object
- •Spell-Checking Documents
- •Programming Excel
- •The Worksheets Collection and the Worksheet Object
- •The Range Object
- •Using Excel as a Math Parser
- •Programming Outlook
- •Retrieving Information
- •Recursive Scanning of the Contacts Folder
- •Summary
- •Advanced Array Topics
- •Sorting Arrays
- •Searching Arrays
- •Other Array Operations
- •Array Limitations
- •The ArrayList Collection
- •Creating an ArrayList
- •Adding and Removing Items
- •The HashTable Collection
- •VB.NET at Work: The WordFrequencies Project
- •The SortedList Class
- •The IEnumerator and IComparer Interfaces
- •Enumerating Collections
- •Custom Sorting
- •Custom Sorting of a SortedList
- •The Serialization Class
- •Serializing Individual Objects
- •Serializing a Collection
- •Deserializing Objects
- •Summary
- •Handling Strings and Characters
- •The Char Class
- •The String Class
- •The StringBuilder Class
- •VB.NET at Work: The StringReversal Project
- •VB.NET at Work: The CountWords Project
- •Handling Dates
- •The DateTime Class
- •The TimeSpan Class
- •VB.NET at Work: Timing Operations
- •Summary
- •Accessing Folders and Files
- •The Directory Class
- •The File Class
- •The DirectoryInfo Class
- •The FileInfo Class
- •The Path Class
- •VB.NET at Work: The CustomExplorer Project
- •Accessing Files
- •The FileStream Object
- •The StreamWriter Object
- •The StreamReader Object
- •Sending Data to a File
- •The BinaryWriter Object
- •The BinaryReader Object
- •VB.NET at Work: The RecordSave Project
- •The FileSystemWatcher Component
- •Properties
- •Events
- •VB.NET at Work: The FileSystemWatcher Project
- •Summary
- •Displaying Images
- •The Image Object
- •Exchanging Images through the Clipboard
- •Drawing with GDI+
- •The Basic Drawing Objects
- •Drawing Shapes
- •Drawing Methods
- •Gradients
- •Coordinate Transformations
- •Specifying Transformations
- •VB.NET at Work: Plotting Functions
- •Bitmaps
- •Specifying Colors
- •Defining Colors
- •Processing Bitmaps
- •Summary
- •The Printing Objects
- •PrintDocument
- •PrintDialog
- •PageSetupDialog
- •PrintPreviewDialog
- •PrintPreviewControl
- •Printer and Page Properties
- •Page Geometry
- •Printing Examples
- •Printing Tabular Data
- •Printing Plain Text
- •Printing Bitmaps
- •Using the PrintPreviewControl
- •Summary
- •Examining the Advanced Controls
- •How Tree Structures Work
- •The ImageList Control
- •The TreeView Control
- •Adding New Items at Design Time
- •Adding New Items at Runtime
- •Assigning Images to Nodes
- •Scanning the TreeView Control
- •The ListView Control
- •The Columns Collection
- •The ListItem Object
- •The Items Collection
- •The SubItems Collection
- •Summary
- •Types of Errors
- •Design-Time Errors
- •Runtime Errors
- •Logic Errors
- •Exceptions and Structured Exception Handling
- •Studying an Exception
- •Getting a Handle on this Exception
- •Finally (!)
- •Customizing Exception Handling
- •Throwing Your Own Exceptions
- •Debugging
- •Breakpoints
- •Stepping Through
- •The Local and Watch Windows
- •Summary
- •Basic Concepts
- •Recursion in Real Life
- •A Simple Example
- •Recursion by Mistake
- •Scanning Folders Recursively
- •Describing a Recursive Procedure
- •Translating the Description to Code
- •The Stack Mechanism
- •Stack Defined
- •Recursive Programming and the Stack
- •Passing Arguments through the Stack
- •Special Issues in Recursive Programming
- •Knowing When to Use Recursive Programming
- •Summary
- •MDI Applications: The Basics
- •Building an MDI Application
- •Built-In Capabilities of MDI Applications
- •Accessing Child Forms
- •Ending an MDI Application
- •A Scrollable PictureBox
- •Summary
- •What Is a Database?
- •Relational Databases
- •Exploring the Northwind Database
- •Exploring the Pubs Database
- •Understanding Relations
- •The Server Explorer
- •Working with Tables
- •Relationships, Indices, and Constraints
- •Structured Query Language
- •Executing SQL Statements
- •Selection Queries
- •Calculated Fields
- •SQL Joins
- •Action Queries
- •The Query Builder
- •The Query Builder Interface
- •SQL at Work: Calculating Sums
- •SQL at Work: Counting Rows
- •Limiting the Selection
- •Parameterized Queries
- •Calculated Columns
- •Specifying Left, Right, and Inner Joins
- •Stored Procedures
- •Summary
- •How About XML?
- •Creating a DataSet
- •The DataGrid Control
- •Data Binding
- •VB.NET at Work: The ViewEditCustomers Project
- •Binding Complex Controls
- •Programming the DataAdapter Object
- •The Command Objects
- •The Command and DataReader Objects
- •VB.NET at Work: The DataReader Project
- •VB.NET at Work: The StoredProcedure Project
- •Summary
- •The Structure of a DataSet
- •Navigating the Tables of a DataSet
- •Updating DataSets
- •The DataForm Wizard
- •Handling Identity Fields
- •Transactions
- •Performing Update Operations
- •Updating Tables Manually
- •Building and Using Custom DataSets
- •Summary
- •An HTML Primer
- •HTML Code Elements
- •Server-Client Interaction
- •The Structure of HTML Documents
- •URLs and Hyperlinks
- •The Basic HTML Tags
- •Inserting Graphics
- •Tables
- •Forms and Controls
- •Processing Requests on the Server
- •Building a Web Application
- •Interacting with a Web Application
- •Maintaining State
- •The Web Controls
- •The ASP.NET Objects
- •The Page Object
- •The Response Object
- •The Request Object
- •The Server Object
- •Using Cookies
- •Handling Multiple Forms in Web Applications
- •Summary
- •The Data-Bound Web Controls
- •Simple Data Binding
- •Binding to DataSets
- •Is It a Grid, or a Table?
- •Getting Orders on the Web
- •The Forms of the ProductSearch Application
- •Paging Large DataSets
- •Customizing the Appearance of the DataGrid Control
- •Programming the Select Button
- •Summary
- •How to Serve the Web
- •Building a Web Service
- •Consuming the Web Service
- •Maintaining State in Web Services
- •A Data-Driven Web Service
- •Consuming the Products Web Service in VB
- •Summary
590 Chapter 13 WORKING WITH FOLDERS AND FILES
The GetTempPath method returns the system’s temporary folder. All temporary files should be created in this folder, so that the operating system can remove them when it’s running out of space. Your applications should remove all the temporary files they create, but more often than not, programmers leave temporary files around.
HasExtension
This method returns a True/False value indicating whether a path includes a file extension.
VB.NET at Work: The CustomExplorer Project
The CustomExplorer application, which demonstrates the basic properties and methods of the Directory and File objects, duplicates the functionality of Windows Explorer. Its user interface, shown in Figure 13.1, leaves a lot to be desired, but we’ll come back to this example in Chapter 16, where we’ll discuss the TreeView and ListView controls and you’ll see how you can build a more elaborate user interface, but the core of the application will remain pretty much the same. In this chapter, you’ll see how the basic members of the Directory and File objects can be used to manipulate the file system.
Figure 13.1
The Custom-
Explorer project
When you start the application, the names of all the logical drives will be displayed in the top-left ComboBox control, as shown in Figure 13.1. The other controls are initially empty. To view the folders of a drive, just select it in the ComboBox control. When the root folder’s contents appear in the second ListBox control, you can click a folder’s name to view its subfolders and its files. The selected folder’s subfolders will replace the contents of the FoldersList ListBox under the ComboBox control, and the selected folder’s files will replace the contents of the FilesList ListBox.
When you’re not viewing the root folder, the parent folder’s symbol (two periods) will appear at the top of the ListBox control with the folder names. You can click this item to move to the parent folder. The application allows you to use simple clicks to move up and down the hierarchy of your file system. You may wish to make the application a little more elaborate by programming the DoubleClick event too.
The three controls are named DrivesList, FoldersList, and FilesList. When the application is initialized (Listing 13.8), it calls the ShowAllDrives() subroutine, which populates the DrivesList control with the names of the logical drives. The ShowAllDrives() subroutine calls the GetLogicalDrives method of the Directory object and then goes through the array returned by this method and adds each logical drive’s letter to the DrivesList control. The ShowAllDrives() subroutine is shown in Listing 13.9.
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
ACCESSING FOLDERS AND FILES 591
Listing 13.8: CustomExplorer’s Form_Load Event Handler
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
ShowAllDrives()
DrivesList.SelectedIndex = 1
Me.Text = Directory.GetCurrentDirectory
End Sub
Listing 13.9: The ShowAllDrives() Subroutine
Sub ShowAllDrives()
Dim drives() As String
drives = Directory.GetLogicalDrives() Dim aDrive As String DrivesList.Items.Clear()
For Each aDrive In drives DrivesList.Items.Add(aDrive)
Next End Sub
When a drive is selected in the DrivesList control, the program calls the ShowFoldersInDrive subroutine (Listing 13.10) to display the folders in the selected drive’s root folder on the FoldersList control. The ShowFoldersInDrive() subroutine accepts a drive as argument and displays the folders in this drive by iterating through the folders in the array returned by the Directory.GetDirectories method.
Listing 13.10: Displaying the Folders of the Selected Drive
Private Sub DrivesList_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles DrivesList.SelectedIndexChanged
ShowFoldersInDrive(DrivesList.Text) End Sub
Sub ShowFoldersInDrive(ByVal drive As String) Dim folders() As String
Try
folders = Directory.GetDirectories(drive) Catch exception As Exception
MsgBox(exception.Message) Exit Sub
End Try
Dim fldr As String FoldersList.Items.Clear() Dim DI As DirectoryInfo
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
592 Chapter 13 WORKING WITH FOLDERS AND FILES
For Each fldr In folders
DI = New DirectoryInfo(fldr)
FoldersList.Items.Add(DI.Name)
Next
Directory.SetCurrentDirectory(drive)
Me.Text = Directory.GetCurrentDirectory
End Sub
When you select a new folder in the FoldersList control (all you have to do is click the folder’s name), the program replaces the contents of the FoldersList control with the subfolders of the selected folder. It must also display the parent folder’s name (..), so that you can move up in the directory tree. Listing 13.11 shows the code of the FoldersList control’s SelectedIndexChanged event handler:
Listing 13.11: Displaying the Subfolders of the Selected Folder
Private Sub FoldersList_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles FoldersList.SelectedIndexChanged
Dim DI As DirectoryInfo Select Case FoldersList.Text
Case “”
MsgBox(“Please select a folder to expand”) Exit Sub
Case “..” Directory.SetCurrentDirectory(“..”)
Case Else
Directory.SetCurrentDirectory(Directory.GetCurrentDirectory & “\” & _ FoldersList.Text)
Me.Text = Directory.GetCurrentDirectory End Select
Dim folders() As String
Dim selectedFolder As String = FoldersList.Text
folders = Directory.GetDirectories(Directory.GetCurrentDirectory) FoldersList.Items.Clear()
If Directory.GetCurrentDirectory <> _ Directory.GetDirectoryRoot(selectedFolder) Then _
FoldersList.Items.Add(“..”) Dim fldr As String
For Each fldr In folders
DI = New DirectoryInfo(fldr)
FoldersList.Items.Add(DI.Name) Next
ShowFilesInFolder() End Sub
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |
ACCESSING FOLDERS AND FILES 593
This event handler always switches to the selected folder by calling the SetCurrentDirectory method of the Directory object. This simplifies the code considerably, because we can move to the parent folder when the user clicks the two periods with the statement Directory.SetCurrentDirectory(“..”). In other words, we don’t have to keep track of the current directory in our code—we’re always in it. The routine that displays the files in the selected folders is also simplified—it goes through the files of the current directory.
If the selected item in the list is the parent folder symbol (..), the program switches to the parent directory. Otherwise, it switches to the selected folder under the current folder. The program then retrieves all the folders under the selected one and stores them in the folders array. A For Each…Next loop is used to iterate through the items of the array and display them on the FoldersList control, replacing its existing contents. Then, it calls the ShowFilesInFolder subroutine, which retrieves the files in the current folder and displays them in the FilesList control (see Listing 13.12).
Listing 13.12: The ShowFilesInFolder() Subroutine
Sub ShowFilesInFolder() Dim file As String Dim FI As FileInfo
FilesList.Items.Clear()
For Each file In Directory.GetFiles(Directory.GetCurrentDirectory) FI = New FileInfo(file)
FilesList.Items.Add(FI.Name) Next
End Sub
The code uses the FileInfo class to retrieve the file’s name. You can also use the FileInfo class’s members to retrieve additional information about the file.
The program also prints information about any file in the Output window. Every time the user selects a file in the FilesList control by clicking its name, the program prints the file’s name, followed by the file’s attributes. It only prints the attributes that are set, and it does so by comparing the Attributes property to each of the members of the FileSystemAttributes enumeration. If the file’s attribute is normal, then the string “NORMAL FILE” is printed under the file’s name. If not, each attribute that is set is displayed with the ATTRIBUTES heading in the Output window. The action of the selection of a new file in the FilesList control is signaled by the SelectedIndexChanged event, whose event handler is shown in Listing 13.13.
Listing 13.13: Retrieving a File’s Properties
Private Sub FilesList_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles FilesList.SelectedIndexChanged
Dim selectedFile As String = FilesList.Text
Dim FI As New FileInfo(Directory.GetCurrentDirectory & “\” & _ selectedFile)
Console.WriteLine(FI.Name)
Copyright ©2002 SYBEX, Inc., Alameda, CA |
www.sybex.com |