Страница 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.