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
Đăng trả lời
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

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

Gửi bài 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ụ:

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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:

Mã: Chọn tất cả

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:

Mã: Chọn tất cả

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!

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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:

Mã: Chọn tất cả

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")

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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:

Mã: Chọn tất cả

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)

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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

Mã: Chọn tất cả

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
Sửa lần cuối bởi 1 vào ngày truongphu với 0 lần sửa trong tổng số.
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
Bài viết: 146
Ngày tham gia: Thứ 4 26/03/2008 5:52 pm
Đến từ: Phú Yên
Been thanked: 15 times
Tiếp xúc:

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

Gửi bài 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
Hình đại diện của thành viên
ngaymaikhongtan
Thành viên chính thức
Thành viên chính thức
Bài viết: 38
Ngày tham gia: Thứ 7 29/03/2008 12:05 pm
Đến từ: Cà Mau
Tiếp xúc:

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

Gửi bài 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!
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

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

Gửi bài by truongphu »

ngaymaikhongtan đã viết: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
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

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

Gửi bài 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ý

Mã: Chọn tất cả

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:
Tập tin đính kèm
Shell WinWord và ShortPath.rar
(1.74 KiB) Đã tải về 984 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
LearningVBnet
Bài viết: 5
Ngày tham gia: Thứ 4 20/07/2011 12:00 am
Has thanked: 1 time

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

Gửi bài 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
Bài viết: 105
Ngày tham gia: Thứ 4 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

Gửi bài 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
Bài viết: 28
Ngày tham gia: Thứ 3 30/03/2010 4:14 pm

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

Gửi bài 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.
Hình đại diện của thành viên
khoaakt
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 75
Ngày tham gia: Thứ 3 19/06/2012 6:30 pm
Đến từ: 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
Tiếp xúc:

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

Gửi bài 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?
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

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

Gửi bài by truongphu »

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

Mã: Chọn tất cả

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

.........
Ghé thăm:
Chuyện Linh Tinh
vanthithuy91
Bài viết: 1
Ngày tham gia: Thứ 4 09/01/2013 4:31 pm

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

Gửi bài 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
Bài viết: 9
Ngày tham gia: Thứ 6 25/09/2009 1:52 pm

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

Gửi bài 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!
Đăng trả lời

Quay về