Tổng Quát về Các Lệnh Mở File

Các thủ thuật về hệ thống, thư mục, tập tin và mạng
Post Reply
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Tổng Quát về Các Lệnh Mở File

Post by truongphu »

Thủ thuật: Tổng Quát về Các Lệnh Mở File
Tác giả: truongphu
Mô tả: Tổng Quát về Các Lệnh Mở File. Mong được các bạn giúp đở thêm bài viết vì chữ Tổng Quát "to' quá
A- Lệnh gọi thi hành
A- 1) Lệnh Shell: tham khảo VBLib

* Gọi trình WinWord, Phải có path của WINWORD.EXE. Theo thói quen, có thể bỏ phần ".exe" Ví dụ:

Code: Select all

aaa = Shell("D:\Office\Microsoft Office\Office10\WINWORD", 1)
* Gọi trình WinWord và mở file doc nào đó:

Code: Select all

aaa = Shell("D:\Office\Microsoft Office\Office10\WINWORD  C:\MùaThu~1.doc", 1)
Lưu ý: tên file không được có space, ví dụ sau sẽ không chạy được:

Code: Select all

NotRun = Shell("D:\Office\Microsoft Office\Office10\WINWORD.EXE" "C:\Mùa Thu Lá bay", 1)
* Ta có thể dùng trình văn bản để mở một file bất kỳ, đọc thấy toàn mã máy:

Code: Select all

aaa = Shell("C:\Program Files\Windows NT\Accessories\wordpad  c:\windows\system32\calc.exe", 1)
* Khi Shell gọi một trình của MS Windows (ví dụ calc.exe) trong các thư mục gốc hay hệ thống (windows\ hay windows\system32), do khi khởi động, biến môi trường đã nộp vào bộ nhớ nên ta có thể bỏ qua đường dẫn, bất kể trên máy nào đó có cài winXP ở đâu!

Code: Select all

aaa = Shell ("calc")
hoặc gọn hơn nữa

Code: Select all

Shell "calc"
nguyên tắc gọn nầy cũng dùng với các trình khác:

Code: Select all

Shell "D:\Office\Microsoft Office\Office10\WINWORD"Shell "D:\Office\Microsoft Office\Office10\WINWORD  C:\MùaThu~1.doc"
A- 2) Lệnh ShellExecute:
ShellExecute là tự chạy một yêu cầu, có thể là một file, hay một câu lệnh, VỚI ĐIỀU KIỆN LÀ FILE ĐÓ, HAY CÂU LỆNH ĐÓ ĐÃ ĐƯỢC KHAI BÁO TRONG WINDOWS LÀ MỞ VỚI TRÌNH NÀO
Vậy thì một file hay một câu lệnh chưa đăng ký "Open With" thì ShellExecute cũng vô tác dụng!

Vì lý do trên, ta nên cân nhắc khi gọi ShellExecute, ví dụ muốn xem nội dung một file không có đuôi mở rộng, ta chỉ cần gọi Shell để chạy Notepad hay Wordpad load file cần xem, tránh khai báo rườm rà không cần thiết.

Khai báo hàm API:

Code: Select all

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile  As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPrivate Sub Form_Load()ShellExecute Me.hwnd, vbNullString, "C:\Mùa Thu Lá Bay.doc", vbNullString, "C:\", 1End Sub
Nhận xét: Tên file tự do

A- 3) VBScript
* Gọi một ứng dụng
Các dòng lệnh sau tương đương với các dòng lệnh của Shell:
Set objShell = CreateObject("Wscript.Shell")

Code: Select all

objShell.Run "calc"objShell.Run ("ping 10.0.0.2")objShell.Run "WINWORD"objShell.Run "EXCEL"
Nhận xét: Tốn một câu khai báo: "Set objShell =...", nhưng khi chạy các ứng dụng đã đăng ký, ví dụ WinWord thì khỏi khai path, khác với Shell
* Mở một file văn bản

Code: Select all

Set objword = CreateObject("Word.Application").Documents.Open("C:\Mùa Thu Lá Bay.Doc", 1)
B- Lệnh mở và thao tác trên file với thao tác cơ bản là Đọc, Ghi. Trong bài viết nầy chỉ minh họa thao tác Đọc
B- 1) Lệnh Open: tham khảo VBLib

a- Chuyên mở file TXT
trích VBLib:

Code: Select all

Private Sub Form_Load()Dim TextLine    Open "TESTFILE" For Input As #1' Mo file Ðê Ðoc.        Do While Not EOF(1)            Line Input #1, TextLine' Ðoc tung dòng gán vào biên TextLine            Debug.Print TextLine' In ra màn hình        Loop    Close #1' Ðóng file.End Sub
b- Đọc text Unicode
trích VBLib: (trong VBLib phần nầy còn sót vài thành phần. Code sau đây hoàn chỉnh hơn)

Code: Select all

Private Sub Form_Load()Dim fNum As Long, B() As Byte, fp    fp = "C:\Mùa Thu Lá Bay.txt"    fNum = FreeFile()    Open fp For Binary Access Read As #fNum        ReDim B(LOF(fNum))    Get #fNum, , B    Close #fNum     Dim arr, i As Integer, s As String    arr = Split(B, vbCrLf)     For i = 0 To UBound(arr)            s = s & arr(i) & vbCrLf     Next iTextBox1 = sEnd Sub
B- 2) VBScript cho TXT: Tham khảo thêm Mục Tip VB
Đọc bất kể mã unicode! quá gọn

Code: Select all

Private Function ReadFileUni(FileName As String) As StringDim FSO   Set FSO = CreateObject("Scripting.FileSystemObject").OpenTextFile(FileName, 1, , -2)   ReadFileUni = FSO.Readall   Set FSO = NothingEnd Function Private Sub Form_Load()TextBox1 = ReadFileUni("C:\Mùa Thu Lá Bay.txt")End Sub
B- 3) VBScript cho Doc (hoặc dưới nó như RTF, TXT): Tham khảo thêm Mục Tip VB

Code: Select all

Private Sub Form_Load()Set objWord = CreateObject("Word.Application")objWord.ChangeFileOpenDirectory ("C:\")objWord.FileDialog(1).Title = "Select the files" If objWord.FileDialog(1).Show = -1 Then    For Each objFile In objWord.FileDialog(1).SelectedItems        Set objDoc = objWord.Documents.Open(objFile)        objDoc.Range.Copy    NextEnd If TextBox1.PasteobjWord.QuitEnd Sub
Sáng 30/4/08 rảnh, chiều có thể nghỉ bù! :D

Bổ sung: Đọc file txt từng dòng

Code: Select all

Private Function ReadLineText(FileName As String) As StringConst ForReading = 1, ForWriting = 2, TriStateTrue = -2Dim FSO:    Set FSO = CreateObject("Scripting.FileSystemObject").OpenTextFile(FileName, 1, False, -2)   Do Until FSO.AtEndOfStream    ReadLineText = ReadLineText & FSO.ReadLine & vbCrLf   Loop   Set FSO = NothingEnd Function Private Sub Form_Load()MsgBox ReadLineText("C:\Mùa Thu Lá Bay.txt")End Sub
Last edited by truongphu on Thu 01/05/2008 3:36 pm, edited 1 time in total.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
vinhphuoc91
Thành viên tích cực
Thành viên tích cực
Posts: 146
Joined: Wed 26/03/2008 5:52 pm
Location: Phú Yên
Been thanked: 15 times
Contact:

Re: Tổng Quát về Các Lệnh Mở File

Post by vinhphuoc91 »

woa, cảm ơn pác truongphu, bài này nên đưa vào Các bài viết hướng dẫn, mà lần sau pác nhớ lồng thẻ code vào nhé :)
My website : http://tinthoitrang.net
User avatar
ngaymaikhongtan
Thành viên chính thức
Thành viên chính thức
Posts: 38
Joined: Sat 29/03/2008 12:05 pm
Location: Cà Mau
Contact:

Re: Tổng Quát về Các Lệnh Mở File

Post by ngaymaikhongtan »

Xin bác giới thiệu về phần đọc file txt rỏ hơn tí àh, phần đọc từng chuổi của nó trên từng dòng, không phải là truy xuất cả dòng, em đang viết bên vb.net!
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Tổng Quát về Các Lệnh Mở File

Post by truongphu »

ngaymaikhongtan wrote:Xin bác giới thiệu về phần đọc file txt rỏ hơn tí àh, phần đọc từng chuổi của nó trên từng dòng, không phải là truy xuất cả dòng,
Lệnh FSO.Readall sẽ thành lệnh FSO.ReadLine
Thêm Do Until FSO.AtEndOfStream
...
Loop để duyệt từng dòng
Các code khác như cũ. Tôi đã bổ sung ở trên, phần cuối bài
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Tổng Quát về Các Lệnh Mở File

Post by truongphu »

Dùng lệnh Shell gọi Word ra để mở một file doc nguyên tắc là OK
Tuy nhiên khi thực hành bằng code, rất nhiều bạn thất bại, lý do:

1- Khai báo code chưa đúng
2- Đường dẫn WinWord dài bao nhiêu cũng được, nhưng đường dẫn file doc TUYỆT ĐỐI PHẢI 8.3
3- chưa hổ trợ tên file (hay đường dẫn) có tiếng Việt

Để đơn giản hóa vấn đề, tôi viết một Project: Dùng CommonDialog (khai bằng code) gọi lần lượt WinWord và File Doc, giao cho SHELL xử lý

Code: Select all

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long Private Sub Command1_Click()Dim WordPath$MsgBox "Tìm WinWord o' Ðâu ?"WordPath = CDL(3, "D:\Office\Microsoft Office\OFFICE11")If WordPath = "" Then Exit SubMsgBox "Tìm thâ'y Word.EXE o':" & vbCrLf & WordPath & vbCrLf & "Mo' File Word o' Ðâu ?" & vbCrLf & "(KHÔNG HÔ TRO' FILENAME TIÊ'NG VIÊT)"Shell WordPath & " " & ShortPath(CDL(, "D:\MY DOCUMENTS")), vbNormalFocusEnd Sub Private Function ShortPath(ByVal FileName As String) As String    Dim lngRes As Long, strPath As String    'Create a buffer    strPath = String$(165, 0)    'retrieve the short pathname    lngRes = GetShortPathName(FileName, strPath, 164)    'remove all unnecessary chr$(0)'s    ShortPath = Left$(strPath, lngRes)End Function Private Function CDL(Optional ByVal FilterNum As Integer = 1, Optional ByVal FirstDir As String = "D:\") As StringSet Dialog = CreateObject("UserAccounts.CommonDialog")Dialog.Filter = "Word Document|*.Doc|Text File|*.txt|All Files|*.*"  '<-- các file cân locDialog.filterIndex = FilterNum '<- 1 là doc, 2 là text nhu' o' trên Ðã khaiDialog.InitialDir = FirstDir  '<-- Thay Ðôi thu' muc mac ÐinhDialog.ShowOpenCDL = Dialog.FileNameEnd Function
các bạn có thể dùng ngay Project nhẹ hều:
Attachments
Shell WinWord và ShortPath.rar
(1.74 KiB) Downloaded 955 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
LearningVBnet
Posts: 5
Joined: Wed 20/07/2011 12:00 am
Has thanked: 1 time

Re: Tổng Quát về Các Lệnh Mở File

Post by LearningVBnet »

Bạn truongphu, tôi thấy các bài và câu trả lời của bạn rất hữu ích, chứng tỏ bạn có kiến thức khá rộng về VB và VB.net. Trước tôi có biết chút ít về VB và đang tự học VB.net. bạn có thể cho tôi biết địa chỉ email để liên lạc với bạn k0 vì tôi có vài câu hỏi muốn hỏi bạn nhờ bạn trả lời. tôi đề nghị như vậy vì không muốn bị coi là gửi spam, khi làm được rồi tôi sẽ post bài lên forum để mọi người cùng trao đổi kinh nghiệm. Cảm ơn truongphu!
Email của tôi: vutienphong.cdt1b@gmail.com
-----------------------
Xin lỗi! để học hỏi chứ không có ý định spam.
nguyentrinhthu
Thành viên tích cực
Thành viên tích cực
Posts: 105
Joined: Wed 23/04/2008 8:43 am
Has thanked: 6 times
Been thanked: 1 time

Re: Tổng Quát về Các Lệnh Mở File

Post by nguyentrinhthu »

công nhận bác truongphu siêu quá. Ai có tài chính đề nghị đóng góp cho diễn đàn để động viên các thành viên
Qsoft
Thành viên chính thức
Thành viên chính thức
Posts: 28
Joined: Tue 30/03/2010 4:14 pm

Re: Tổng Quát về Các Lệnh Mở File

Post by Qsoft »

Cảm ơn bác truongphu, tôi thấy nó gắn gọn và rất hữu ích. Hy vọng bác sẽ có nhiều bài viết hay nữa.
User avatar
khoaakt
Thành viên năng nổ
Thành viên năng nổ
Posts: 75
Joined: Tue 19/06/2012 6:30 pm
Location: http://việtnam.vn/Kontum/Trường/THPT Chuyên Nguyễn Tất Thành.htm
Has thanked: 8 times
Been thanked: 7 times
Contact:

Re: Tổng Quát về Các Lệnh Mở File

Post by khoaakt »

Bác Truongphu siêu ghê! Nhưng nếu ta dùng lệnh shell thì khi mở file exe thì cửa sổ lại để dạng Minimize?
Ai có cách khắc phục?
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Tổng Quát về Các Lệnh Mở File

Post by truongphu »

khoaakt wrote:khi mở file exe thì cửa sổ lại để dạng Minimize?

Code: Select all

Shell "PathName", vbNormalFocus
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
vanthithuy91
Posts: 1
Joined: Wed 09/01/2013 4:31 pm

Re: Tổng Quát về Các Lệnh Mở File

Post by vanthithuy91 »

Bác truongphu, em đang học cách giải một số bài toán trên vb. Em có một số thắc mắc muốn hỏi vì vậy em muốn xin địa chỉ email của bác không biết có được không? Nếu được bác gửi lại giúp em vào địa chỉ: bienxanhcuoi91@gmail.com mới ạ. Thanks!
tigerhn
Posts: 9
Joined: Fri 25/09/2009 1:52 pm

Re: Tổng Quát về Các Lệnh Mở File

Post by tigerhn »

Bác TruongPhu cho em hỏi chút:
Em đang lập 1 số dự toán công trình (có mẫu giống nhau), trước đây em lập 1 file mẫu trên Excel, sau đó em viết 1 tool nhỏ bằng VB6 để mở file mẫu, copy và paste dữ liệu vào file mẫu
Hiện tại do yêu cầu của Chủ đầu tư yêu cầu phải lập trên G8, mà dịnh dạng file kết quả của G8 là *.hce.

Bác có cách nào để mở file *.hce và paste số liệu vào đó không?
Cảm ơn bác nhiều!
Post Reply

Return to “[VB] Hệ thống - Tập tin - Thư mục và Mạng”