PDA

View Full Version : Copyfile - Nhờ xem hộ sai chỗ nào



tklshb
02-04-2008, 20:45
Tôi muốn tạo một Project gồm một form (có hai Command button). Khi tôi nhấn Cmd1 thì tự động copy file vào C:\Documents and Settings\TUAN ANH\Application Data\Microsoft\Word\STARTUP.VÀ khi nhấn Cmd2 thì Form sẽ đóng lại. Tuy nhiên, ở đây có một vấddeeef mà tôi không biết phải làm sao. Như các bạn thấy, máy tôi có Username là TUAN ANH. Máy khác chắc chắn có tên khác. Vậy tôi phải viết như thế nào để tôi có thể dùng file Copy đó ở mọi máy mà không cần chỉnh sửa gì?
P/S: Sao tôi không thể gửi kèm file được nhỉ? Các cao thủ ơi, giúp tôi với

lee_huynh306
02-04-2008, 21:00
Trong Environment Variable nó có 1 cái biến %USERPROFILE%, trả về cái thư mục bạn cần, + thêm string "\Application..." sẽ ra thôi.

hctv1909
04-04-2008, 10:01
enviroment varible nằm ở đâu vậy bạn?

huytranaz
04-04-2008, 10:43
enviroment varible nằm ở đâu vậy bạn?

Trong Visual Basic có hàm để lấy giá trị của biến môi trường (Envioronment Variables). Cú pháp: Environ(<Tên biến môi trường>) hoặc Environ$(<Tên biến môi trường>). Ví dụ, để lấy đường dẫn đến thư mục tài khoản cá nhân đăng nhập Windows: Environ$("USERPROFILE"). Lưu ý các bạn là hàm xử lý chuỗi có ký tự $ ở sau sẽ chạy nhanh hơn hàm tương ứng không có dấu $ vì chúng dùng cách sao chép địa chỉ.

Chúc vui,

tklshb
04-04-2008, 21:59
Bạn có thể post thử một đoạn mã được không? Tôi không hiểu làm thế nào để chèn vào dòng lệnh Copyfile để khi ta nhấn nút thì nó sẽ copy đúng 1 file từ thư mục X, Y nào đó vào thư mục như tôi đã viết trên bài trên. Cám ơn bạn

huytranaz
05-04-2008, 19:59
Bạn có thể post thử một đoạn mã được không? Tôi không hiểu làm thế nào để chèn vào dòng lệnh Copyfile để khi ta nhấn nút thì nó sẽ copy đúng 1 file từ thư mục X, Y nào đó vào thư mục như tôi đã viết trên bài trên. Cám ơn bạn

Giả sử bạn đã có hàm CopyFile(SrcPath As String, DestPath As String). Thì khi nhấn nút cmdCopy sẽ gọi hàm này như sau:

CopyFile "Đường dẫn file của bạn", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP"

Chúc bạn thành công,

tklshb
06-04-2008, 22:43
Cám ơn bạn nhiều, tôi sẽ thử xem sao.

tklshb
11-04-2008, 22:47
Tôi đã viết được đoạn mã Copyfile rồi. Tuy nhiên, tôi muốn khi đã copy xong thì hiện lên Msgbox" Cài đặt kết thúc"(Ví dụ thế). Còn nếu không thấy file ở địa chỉ nguồn thì hiện lên Msgbox"Không tìm thấy file x,y,z". Các bạn hãy giúp tôi nha! Cám ơn các bạn nhiều!

tklshb
15-04-2008, 20:47
Mãi chẳng thấy các bạn trả lời gì cả! Có ai có ý kiến gì không? Còn đây là đoạn mã mà tôi viết.Tôi muốn là khi file đã được copy thì Command2.Caption sẽ chuyển thành Hoàn tất. Sau đó nhấn vào đó thì sẽ thoát khỏi trình. Còn nếu ở thư mục nguồn không có file Tn.dot thì sẽ hiện lên thông báo " Không tìm thấy file Tn.dot". Không biết phải khai báo thêm gì? Các bạn cho tôi ý kiến nhé! Cám ơn nhiều!

Option Explicit
Private Sub Command1_Click()
FileCopy "C:\TN\Tn.dot", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot"
End Sub

Private Sub Command2_Click()
End
End Sub

buonbannet08
15-04-2008, 22:32
Bạn dùng lệnh Dir để kiểm tra xem file có tồn tại hay ko

if Dir("C:\TN\Tn.dot") = "" Then Msgbox "Ko thay file"

tklshb
16-04-2008, 09:39
Tôi đã thử làm theo bạn hướng dẫn nhưng nó toàn báo lỗi Run-time error '70' thôi. Nếu dùng đoạn mã trên thì phải thêm vào chỗ nào? Vui lòng hướng dẫn tôi, tôi mới biết chút ít về VB mà lại không có nhiều tài liệu. Cám ơn các bạn

huytranaz
17-04-2008, 14:03
Mãi chẳng thấy các bạn trả lời gì cả! Có ai có ý kiến gì không? Còn đây là đoạn mã mà tôi viết.Tôi muốn là khi file đã được copy thì Command2.Caption sẽ chuyển thành Hoàn tất. Sau đó nhấn vào đó thì sẽ thoát khỏi trình. Còn nếu ở thư mục nguồn không có file Tn.dot thì sẽ hiện lên thông báo " Không tìm thấy file Tn.dot". Không biết phải khai báo thêm gì? Các bạn cho tôi ý kiến nhé! Cám ơn nhiều!

Option Explicit
Private Sub Command1_Click()
FileCopy "C:\TN\Tn.dot", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot"
End Sub

Private Sub Command2_Click()
End
End Sub
Sao bạn không sử dụng hàm API kiểm tra tập tin tồn tại hay không, bạn khai báo API này ở đầu form nhé:


Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Trong code của bạn bạn sửa lại như sau:


Option Explicit
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Private Sub Command1_Click()
If PathFileExists("C:\TN\Tn.dot")>0 then
FileCopy "C:\TN\Tn.dot", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot"
Else
Msgbox "File not found!",VbOkOnly Or VbExclamation
End If
End Sub

Private Sub Command2_Click()
'End : Hạn chế sử dụng hàm End để đóng toàn bộ chương trình vì hàm End tương tự hàm API TerminateProcess, sẽ không giải phóng tài nguyên và các hook, rất dễ gây gãy đổ hệ thống.
Unload Me
End Sub


Chúc bạn thành công,

tklshb
17-04-2008, 23:54
Cám ơn bạn Huy rất nhiều. Tôi sẽ thử theo cách của bạn. Rất vui nếu còn có dịp bạn chỉ giáo thêm.
Chúc mạnh khoẻ
Tuấn Anh

[=========> Bổ sung bài viết <=========]

Bạn Huy thân mến!
Tôi đã thử sửa lại theo gợi ý của bạn, rất tiếc, vẫn thấy báo lỗi '70". Bạn vui lòng kiểm tra lại giúp tôi được không?
Thank you before hand!
Tuấn Anh

huytranaz
18-04-2008, 11:01
Cám ơn bạn Huy rất nhiều. Tôi sẽ thử theo cách của bạn. Rất vui nếu còn có dịp bạn chỉ giáo thêm.
Chúc mạnh khoẻ
Tuấn Anh

[=========> Bổ sung bài viết <=========]

Bạn Huy thân mến!
Tôi đã thử sửa lại theo gợi ý của bạn, rất tiếc, vẫn thấy báo lỗi '70". Bạn vui lòng kiểm tra lại giúp tôi được không?
Thank you before hand!
Tuấn Anh
Bạn cần thêm đoạn code kiểm tra file đích đã tồn tại chưa nữa. Lỗi 70 là lỗi "Permission denied". Bạn sửa code lại như sau nhé, lưu ý hàm Copyfile cần chỉnh sửa lại, thêm thông số Overwrite (Nếu file đích đã tồn tại thì xóa trước khi copy lại). Mặt khác, trong các hàm quan trọng, nên có error hander để chặn lỗi runtime:


Option Explicit
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Private Sub Command1_Click()
On Error Goto COPY_FAILED
If PathFileExists("C:\TN\Tn.dot")>0 then
If PathFileExists(Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot") Then
If Msgbox ("Destination file is exists, overwrite it?",VbYesNo Or VbQuestion)=VbYes Then
FileCopy "C:\TN\Tn.dot", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot",True
End If
Else
FileCopy "C:\TN\Tn.dot", Environ$("USERPROFILE") & "\Application Data\Microsoft\Word\STARTUP\Tn.dot"
End If
Else
Msgbox "File not found!",VbOkOnly Or VbExclamation
End If
Exit Sub
COPY_FAILED:
Msgbox "Copy file failed: 0x" & hex$(Err.Number) & " (" & Err.Description & ")", VbOkOnly Or VbCritical
End Sub

Private Sub Command2_Click()
'End : Hạn chế sử dụng hàm End để đóng toàn bộ chương trình vì hàm End tương tự hàm API TerminateProcess, sẽ không giải phóng tài nguyên và các hook, rất dễ gây gãy đổ hệ thống.
Unload Me
End Sub

Chúc bạn thành công,

tklshb
18-04-2008, 22:03
Huy Trần thân mến!
Rất cám ơn vì sự giúp đỡ của bạn. Thật vui vì có những người nhiệt tình như bạn bên cạnh. Chân thành cám ơn>