2015-09-10 18 views
7

Công ty tôi đang làm việc có một chương trình được viết trong ye olde vb6, được cập nhật khá thường xuyên và hầu hết khách hàng chạy tệp thực thi từ ổ đĩa mạng được ánh xạ. Điều này thực sự có vài vấn đề đáng ngạc nhiên, lớn nhất trong số đó là cập nhật tự động. Hiện tại chương trình cập nhật (viết bằng C++) đổi tên exe hiện có, sau đó tải xuống và đặt phiên bản mới vào vị trí của phiên bản cũ. Điều này thường hoạt động tốt, nhưng trong một số môi trường nó chỉ đơn giản là thất bại.Đóng các tệp được chia sẻ theo lập trình

Giải pháp đang chạy this command from microsoft:

for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close 

Lệnh này đóng tất cả file mạng được chia sẻ (cũng ... nhất) và sau đó cập nhật có thể thay thế exe.

Trong C++ tôi có thể sử dụng chức năng System(""); để chạy lệnh đó hoặc tôi có thể chuyển hướng kết quả của net files và lặp qua kết quả tìm kiếm tệp cụ thể được đề cập và chạy lệnh net file /close để đóng chúng. Nhưng nó sẽ đẹp hơn nhiều nếu có các hàm winapi có khả năng tương tự cho độ tin cậy tốt hơn và an toàn trong tương lai.

Có cách nào để tôi lập trình tìm tất cả các tệp được chia sẻ trên mạng và đóng các tệp có liên quan không?

+0

Âm thanh như thế này là câu hỏi C++ của Windows ... – shargors

+0

Có, xin lỗi tôi sẽ thêm thẻ – wizebin

+1

Tôi khuyên bạn nên tìm kiếm MSDN để tìm một số API Windows có thể giúp bạn đóng tệp mạng. –

Trả lời

7

Bạn có thể lập trình làm những gì net file /close thực hiện. Chỉ cần bao gồm lmshare.h và liên kết đến Netapi32.dll. Bạn có hai chức năng để sử dụng: NetFileEnum để liệt kê tất cả các tệp mạng mở (trên một máy tính đã cho) và NetFileClose để đóng chúng.

Nhanh (nó giả chương trình đang chạy trên cùng một máy chủ và không có quá nhiều kết nối mở, xem đoạn cuối cùng) và bẩn (không kiểm tra lỗi) ví dụ:

FILE_INFO_2* pFile = NULL; 
DWORD nRead = 0, nTotal = 0; 

NetFileEnum(
    NULL, // servername, NULL means localhost 
    "c:\\directory\\path", // basepath, directory where VB6 program is 
    NULL, // username, searches for all users 
    2, // level, we just need resource ID 
    (LPBYTE*)pFiles, // bufptr, 
    MAX_PREFERRED_LENGTH, // prefmaxlen, collect as much as possible 
    &nRead, // entriesread, number of entries stored in pFiles 
    &nTotal, // totalentries, ignore this 
    NULL //resume_handle, ignore this 
); 

for (int i=0; i < nRead; ++i) 
    NetFileClose(NULL, pFile[i].fi2_id); 

NetApiBufferFree(pFile); 

Tham khảo MSDN để biết chi tiết khoảng NetFileEnumNetFileClose. Lưu ý rằng NetFileEnum có thể trả lại ERROR_MORE_DATA nếu có thêm dữ liệu.

+3

Với rất ít sửa đổi, điều này hoạt động hoàn hảo. Trình biên dịch của tôi phàn nàn về dấu phẩy thêm sau khi NULL cuối cùng trong hàm enum và tôi đã phải cast pFiles '(BYTE **) & pFiles' và thay đổi truy cập từ' pFile [i] -> fi2_id' thành truy cập thành viên thay vì truy cập con trỏ 'pFile [i] .fi2_id' – wizebin

+0

@wizebin bạn nói đúng, tôi đã viết nó ở đây mà không cần kiểm tra. Xấu của tôi, cảm ơn bạn! –

+0

dòng lpvoid cần phải được thay đổi thành \t \t (LPBYTE *) & pFiles, // bufptr – Dan

Các vấn đề liên quan