NWIntScanFileInformation. Программирование под Novell

Обсуждение технических вопросов по продуктам Novell

NWIntScanFileInformation. Программирование под Novell

Сообщение Вячеслав Горбатов » 23 июн 2005, 05:48

Уважаемые форумчане!
Может кто поделиться рабочим примером функции NWIntScanFileInformation под Delphi или Си.
Обыскался весь инет, ничего путного в виде примера нет, а найденные описания функци все какие-то древние и под DOS.
На новелическом сервере также пусто, а в документации какая-то неоднозначная ересь описана.

Заранее спасибо!
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Вот пример

Сообщение Andrey Podoinikov » 23 июн 2005, 07:39

Код: Выделить всё

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 );
}

Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

Сообщение Вячеслав Горбатов » 23 июн 2005, 11:02

А такой же пример под Delphi можно где обнаружить? Столкнулся с проблемой преобразования типов...
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Сообщение Andrey Podoinikov » 23 июн 2005, 12:37

Какая проблема?
Какой тип?
Переписывать как-то не хочется :(
Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

Сообщение Вячеслав Горбатов » 23 июн 2005, 13:14

У меня нет описания какие типы используются.
На данный момент я выбираю файл который filePattern ч/з opendialog.
Никак немогу переделать преобразовать opendiakog.filename к pnstr8.
Также по аналогу для iterHandle := -1; вылезла ошибка.

И такой вопрос можно ли использовать какую-либо другую функцию для того что бы узнать создателя файла (желательно с примером)
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Сообщение Andrey Podoinikov » 23 июн 2005, 13:41

На счет других функций не знаю - не разбирался.

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;
Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

Сообщение Вячеслав Горбатов » 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;

В теории должно работать, а вот на практике...
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Сообщение Andrey Podoinikov » 24 июн 2005, 08:32

Я не знаю как у тебя представлен 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.
Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

как это расшифровать?

Сообщение Вячеслав Горбатов » 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 значные числа, а как их можно привязать к имени создателя?
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Сообщение Andrey Podoinikov » 25 июн 2005, 19:34

9-10 знаков ничего не значат - это же число ID пользователя

Посмотри на описание функции NWDSMapIDToName там все понятно :)
Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

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

Сообщение Вячеслав Горбатов » 27 июн 2005, 07:05

Andrey Podoinikov, спасибо, благодаря Вам почти все работает.
Но остался еще один вопрос - на сервере кроме файлов типа 8.3 имеются файлы с более длинным или с русским именем, на такие файлы выскакивает ошибка 0x899C - INVALID_PATH или 0x89FF NO_FILES_FOUND_ERROR. Можно ли узнать создателя-владельца для таких файлов?
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

Сообщение Andrey Podoinikov » 27 июн 2005, 07:58

Используй виндовые функции для получения коротких имен и используй их в NWAPI функциях
Аватара пользователя
Andrey Podoinikov
 
Сообщения: 243
Зарегистрирован: 05 июн 2002, 10:32
Откуда: г. Урай, Тюменская обл.

А русские имена?

Сообщение Вячеслав Горбатов » 27 июн 2005, 10:18

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

Сообщение Timur Kazimirov » 27 июн 2005, 10:33

А может ли эта проблема зависеть от типа установленного клиента? От MS или от Novell?
Timur Kazimirov
 
Сообщения: 1153
Зарегистрирован: 10 фев 2004, 09:56
Откуда: Южно-Сахалинск

Сообщение Вячеслав Горбатов » 27 июн 2005, 10:51

Клиента использую только novell, под ms проверить не получится, т.к. в любом случае у меня конкретное требование использовать только NWClient.
Вячеслав Горбатов
 
Сообщения: 32
Зарегистрирован: 20 дек 2004, 18:03
Откуда: Барнаул

След.

Вернуться в Novell

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23