Piszę aktualnie prosty moduł zarządzający siecią, a ściślej synchronizacją danych w sieci.
Program ma działać w systemie operacyjnym Windows 2000.
Jako RAD IDE używam Borland C++ Builder v6.0.
Aplikacja ma na celu:
1. Wyliczenie zasobów sieciowych (to już zrobione dzięki jednemu z tutoriali Cyfrowego Barona),
2. Wyświetlenie zawartości danego zasobu sieciowego (mam tutaj na myśli wyświetlenie zawartości jakiegoś upublicznionego katalogu) - nad tym obecnie pracuję.
3. W oparciu o dane wyświetlone z udostępnionego publicznie katalogu będzie wykonana synchronizacja z danymi katalogu z dysku lokalnego (w szczególności w oparciu o wielkość i nazwę katalogów/plików).
Mam takie pytanie:
Czy jest możliwe wykonanie tego zadania bez użycia połączenia FTP przez Indy (IdFTP) a jedynie na takiej zasadzie jak odczytuje się zawartość katalogów z dysku lokalnego?
Zapewne coś robię źle, ale próbuję i próbuję i nic mi nie wychodzi.. :/
Oto mój kod:
Plik nagłówkowy:
- Kod: Zaznacz cały
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <FileCtrl.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TButton *Button1;
TComboBox *ComboBox1;
TDirectoryListBox *DirectoryListBox1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private:// User declarations
void __fastcall EnumNetRes(NETRESOURCE* nr);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Plik źródłowy:
- Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void __fastcall TForm1::EnumNetRes(NETRESOURCE* nr)
{
HANDLE hEnum;
if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
nr,&hEnum) != NO_ERROR) return;
DWORD Count = -1;
DWORD BufferSize = 0;
DWORD ReturnVal = 0;
NETRESOURCE *NetRes=(NETRESOURCE *)new char[1024];
ZeroMemory(NetRes, sizeof(NETRESOURCE));
for(;;)
{
ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
if(ReturnVal == ERROR_MORE_DATA)
{
Count = -1;
delete [] NetRes;
NetRes = (NETRESOURCE*)new char[BufferSize];
ZeroMemory(NetRes, sizeof(NETRESOURCE));
ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
}
if(ReturnVal != NO_ERROR) break;
for(unsigned int i = 0; i < Count; i++)
{
ComboBox1->Items->Add(NetRes[i].lpRemoteName);
if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER)
EnumNetRes(&NetRes[i]);
}
if(ReturnVal == ERROR_NO_MORE_ITEMS)
{
delete [] NetRes;
WNetCloseEnum(hEnum);
}
}
delete [] NetRes;
WNetCloseEnum(hEnum);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
EnumNetRes(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
EnumNetRes(NULL);
if ((ComboBox1->Items->operator [](0))!="")
{
ComboBox1->Text=ComboBox1->Items->operator [](0);
}
AnsiString Show_dir; // zmienna pomocnicza
char Show_dir_char[MAX_PATH]; // zmienna pomocnicza
Show_dir=ComboBox1->Text;
Show_dir="\\\\"+Show_dir+"\\*.*"; // ścieżka podobnie jak w total commanderze
ShowMessage(Show_dir); // info pomoc
ComboBox1->Text=Show_dir;
// konwersja AnsiString na char
strncpy(Show_dir_char , Show_dir.c_str(), sizeof Show_dir_char);
DirectoryListBox1->Clear();
DirectoryListBox1->Drive=(char)Show_dir_char;
}
Kod się kompiluje, ale w oknie DirectoryListBox (komponent Win3.1) wyświetla stale ten sam (źle wybrany katalog).
Podczas kompilacji linker wyrzuca także jakiś Warning, w postaci:
- Kod: Zaznacz cały
[C++ Warning] Unit1.cpp(22): W8004 'ReturnVal' is assigned a value that is never used
Zapewne chodzi, o to, że z funkcji EnumNetRes zmienna ReturnVal nie została ani razu użyta, ale to jest akurat dla mnie szczegół.
Z góry WIELKIE DZIĘKI gdyby Ktokolwiek umiał mi jakoś pomóc z tym kodem tak, aby faktycznie dany zasób był wyświetlany w oknie DirectoryListBox1.
Pozdrawiam! samurai-jerry