DevCon bits: troubles with EA

User avatar
Eugene Gorbunoff
Site Admin
Posts: 685
Joined: Sat Apr 09, 2005 11:18
Location: St.Petersburg, Russia

DevCon bits: troubles with EA

Postby Eugene Gorbunoff » Wed Sep 15, 2010 15:13

From: Glassman
Date: 2010/09/13

Тут вот натолкнулся на следующее:

the file object must be opened for read access, with a deny-write sharing mode specified for access by other processes. Thus, if the file object is already accessed by another process that holds conflicting sharing and access rights, a call to DosQueryPathInfo fails.

Т.е. если файл открыт кем то на запись, получить его EA не удастся. Чем плохо - тот же EA фильтр в FOC, таже иконка в EA...

Можно попробовать самому открыть файло с OPEN_SHARE_DENYNONE и получить EA через DosQueryFileInfo. Но, соотв-но, получается что можно получить кривые EA.

Смущает то, что неизвестно, каких порядков может достигать кривизна полученных EA.

Что думает общественность? Или может кто сталкивался уже?

User avatar
Eugene Gorbunoff
Site Admin
Posts: 685
Joined: Sat Apr 09, 2005 11:18
Location: St.Petersburg, Russia

Re: DevCon bits: troubles with EA

Postby Eugene Gorbunoff » Wed Sep 15, 2010 15:54

Glassman

Я полазил по EA, там везде вроде явно указывается размер данных. Поэтому, если аккуратно, то даже при получении каких нибудь недописанных EA ничего особенно страшного быть не должно. Короче, я сделал так:

Code: Select all

/* Gets file information for a file or subdirectory.
 */

APIRET
FOCQueryPathInfo( PCSZ pszPathName, ULONG ulInfoLevel, PVOID pInfoBuf, ULONG cbInfoBuf )
{
 APIRET rc =
   DosQueryPathInfo( pszPathName, ulInfoLevel, pInfoBuf, cbInfoBuf );

 // Because the DosQueryPathInfo try to open a file object for read access,
 // with a deny-write sharing mode, the ERROR_SHARING_VIOLATION can be occured.
 // In this case try to open file manually without a deny-write sharing mode.

 if( rc == ERROR_SHARING_VIOLATION  )
 {
   HFILE hFile;
   ULONG ulAction;

   if( DosOpen( pszPathName, &hFile, &ulAction, 0, 0,
                OPEN_ACTION_FAIL_IF_NEW  | OPEN_ACTION_OPEN_IF_EXISTS,
                OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY,
                NULL ) == NO_ERROR )
   {
     rc = DosQueryFileInfo( hFile, ulInfoLevel, pInfoBuf, cbInfoBuf );
     DosClose( hFile );
   }
 }

 return rc;
}


Return to “Developers / Разработчики”

Who is online

Users browsing this forum: No registered users and 0 guests

cron