Страница 1 из 2
NWIntScanFileInformation. Программирование под Novell

Добавлено:
23 июн 2005, 05:48
Вячеслав Горбатов
Уважаемые форумчане!
Может кто поделиться рабочим примером функции NWIntScanFileInformation под Delphi или Си.
Обыскался весь инет, ничего путного в виде примера нет, а найденные описания функци все какие-то древние и под DOS.
На новелическом сервере также пусто, а в документации какая-то неоднозначная ересь описана.
Заранее спасибо!
Вот пример

Добавлено:
23 июн 2005, 07:39
Andrey Podoinikov
- Код: Выделить всё
void readFiles( char *path )
{
NWDSCCODE ccode, ccode2;
nuint8 iterHandle[ 10 ];
char filePattern[ 255 ];
NW_FILE_INFO2 sbuf;
NWFILE_HANDLE fileHandle;
NW_NS_OPENCREATE openInfo;
printf("connHandle %x \n", connHandle);
printf("path %s \n", path);
ccode = NWAllocTempNSDirHandle2( connHandle, 0, path, 0,&dirHandle,0);
if( !ccode )
{
*((nuint32 *)iterHandle) = -1;
sprintf(filePattern, "%s", path );
do {
ccode = NWIntScanFileInformation2( connHandle, 0, filePattern, FA_NORMAL,(unsigned char *)&iterHandle, &sbuf, 0 );
if( !ccode )
{
openInfo.openCreateMode = OC_MODE_OPEN;
openInfo.searchAttributes = SA_NORMAL;
openInfo.createAttributes = A_NORMAL;
openInfo.accessRights = AR_READ_ONLY;
openInfo.NetWareHandle = 0;
openInfo.openCreateAction = OC_ACTION_OPEN;
printf("Open %s Succeded\n", sbuf.fileName);
ccode2 = NWOpenNSEntry( connHandle, dirHandle, NW_NS_DOS, 0, sbuf.fileName, &openInfo, &fileHandle );
if( !ccode2 )
{
printf("Open %s Succeded\n", sbuf.fileName);
NWCloseFile( fileHandle );
}
} else
fprintf(stderr, "%s: NWIntScanFileInformation2 failed: %X\n",__FILE__, ccode );
} while( !ccode );
ccode = NWDeallocateDirectoryHandle( connHandle, dirHandle );
if( ccode )
fprintf(stderr, "%s: NWDeallocateDirectoryHandle failed: %X\n",__FILE__, ccode );
}
else
fprintf(stderr,"%s: NWAllocTemporaryDirectoryHandle failed: error = %X\n", __FILE__,ccode );
}

Добавлено:
23 июн 2005, 11:02
Вячеслав Горбатов
А такой же пример под Delphi можно где обнаружить? Столкнулся с проблемой преобразования типов...

Добавлено:
23 июн 2005, 12:37
Andrey Podoinikov
Какая проблема?
Какой тип?
Переписывать как-то не хочется


Добавлено:
23 июн 2005, 13:14
Вячеслав Горбатов
У меня нет описания какие типы используются.
На данный момент я выбираю файл который filePattern ч/з opendialog.
Никак немогу переделать преобразовать opendiakog.filename к pnstr8.
Также по аналогу для iterHandle := -1; вылезла ошибка.
И такой вопрос можно ли использовать какую-либо другую функцию для того что бы узнать создателя файла (желательно с примером)

Добавлено:
23 июн 2005, 13:41
Andrey Podoinikov
На счет других функций не знаю - не разбирался.
function U_pStr(var S: string): Pointer;
begin // returns a pointer to the string
result := pointer(pChar(S));
end;
var
filename :string;
filename_copy: pnstr8;
iterHandle: LongInt;
begin
filename_copy:=U_pStr(filename); //преобразование string в pnstr8
iterHandle := LongInt(NO_MORE_ITERATIONS); //не должно быть проблем
end;

Добавлено:
24 июн 2005, 08:18
Вячеслав Горбатов
2Andrey Podoinikov
Все твои функции работают!
Но я пока так и остался на месте
На любой файл, у которого я хочу определить создателя мне выдает одно и тоже число 4294967295.
Использую процедуру
procedure TForm1.N1Click(Sender: TObject);
var FilePattern : pnstr8;
FileSource: string;
iterHandle : LongInt;
INFO:NW_FILE_INFO2;
begin
if OpenDialog1.Execute and FileExists(OpenDialog1.FileName)
then begin
FilePattern:=pointer(pchar(OpenDialog1.FileName));
iterHandle := LongInt(NO_MORE_ITERATIONS);
NWIntScanFileInformation2(connHandle,0,@FilePattern,FA_NORMAL,@iterHandle,INFO,0);
showmessage(inttostr(info.fileOwnerID));
end;
end;
В теории должно работать, а вот на практике...

Добавлено:
24 июн 2005, 08:32
Andrey Podoinikov
Я не знаю как у тебя представлен FilePattern - скорее всего не правильно! Попробуй для начала использовать не выбор через диалог, а просто константу с указанием существующего файла в правильном формате.
Имя тома:\Путь...\ИмяФайла
Читай доку:
dirHandle
(IN) Specifies the NetWare directory handle relative to the filePattern parameter (or 0 if the filePattern parameter points to the complete path, including the volume name).
filePattern
(IN) Points to the string containing the file name or wildcard pattern to use in the search.
как это расшифровать?

Добавлено:
24 июн 2005, 12:44
Вячеслав Горбатов
2Andrey Podoinikov
На данный момент сделал такой вариант
var iterHandle : LongInt;
INFO : NW_FILE_INFO;
Path : String;
nwPath : Array[0..255] Of Char;
DirHandle : NWDIR_HANDLE;
Ccode :NWCCODE;
begin
if OpenDialog1.Execute and FileExists(OpenDialog1.FileName)
then begin
path := OpenDialog1.FileName + #0;
iterHandle := LongInt(NO_MORE_ITERATIONS);
NWParseNetWarePath(@Path[1],connHandle,dirHandle,@nwPath);
Ccode:=NWIntScanFileInformation(connHandle,dirHandle,@nwPath,FA_NORMAL,@iterHandle,INFO,0);
if Ccode=0 then showmessage('Владелец : '+inttostr(info.fileOwnerID))
else showmessage('Ошибка : '+inttostr(Ccode));
end;
end;
Спасибо Andrey Podoinikov
Но остался такой вопрос, на разных файлах выдаются разные значения, в частности 9 или 10 значные числа, а как их можно привязать к имени создателя?

Добавлено:
25 июн 2005, 19:34
Andrey Podoinikov
9-10 знаков ничего не значат - это же число ID пользователя
Посмотри на описание функции
NWDSMapIDToName там все понятно

Как определить создателя для русского имени файла?

Добавлено:
27 июн 2005, 07:05
Вячеслав Горбатов
Andrey Podoinikov, спасибо, благодаря Вам почти все работает.
Но остался еще один вопрос - на сервере кроме файлов типа 8.3 имеются файлы с более длинным или с русским именем, на такие файлы выскакивает ошибка 0x899C - INVALID_PATH или 0x89FF NO_FILES_FOUND_ERROR. Можно ли узнать создателя-владельца для таких файлов?

Добавлено:
27 июн 2005, 07:58
Andrey Podoinikov
Используй виндовые функции для получения коротких имен и используй их в NWAPI функциях
А русские имена?

Добавлено:
27 июн 2005, 10:18
Вячеслав Горбатов
Ни функция GetShortPathName, ни метод в FindFirst -cAlternateFileName для русских символов толку не дали. Т.е. короткое имя я получаю, но функция NWIntScanFileInformation все равно возвращает 0x89FF NO_FILES_FOUND_ERROR.
Буду просить пользователей, что бы они формировали файлы по английски...

Добавлено:
27 июн 2005, 10:33
Timur Kazimirov
А может ли эта проблема зависеть от типа установленного клиента? От MS или от Novell?

Добавлено:
27 июн 2005, 10:51
Вячеслав Горбатов
Клиента использую только novell, под ms проверить не получится, т.к. в любом случае у меня конкретное требование использовать только NWClient.