MoveFileEx: ERROR_NO_MORE_FILES и ERROR_SHARING_VIOLATION

Тема в разделе "WASM.WIN32", создана пользователем psu, 12 дек 2006.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Сразу говорю: получаю ошибки при тестировании проги на удаленных компах ( отчет через сокеты )

    Вопросы:
    1. ERROR_NO_MORE_FILES ошибка что означает?
    2. ERROR_SHARING_VIOLATION - относится к файлу source или target?

    Много раз компилить прогу и заносить ее на другой комп возможности нету, сами понимаете, так что прошу помощи!!
     
  2. Guest

    Guest Guest

    Публикаций:
    0
    - файлы кончились (на подобе FindFirstFile, FindNextFile когда перечислены все файлы - это не ошибка).
    - проблема при доступе к открытому файлу в монопольном режиме.

    1. Исправление зависит от ситуации.
    2. Подойдет статья Ms-rem про доступ к таким файлам.
     
  3. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Где файлы кончились? Перемещается файл из одного места в другое. Вот если бы ERROR_PATH_NOT_EXIST тогда другое дело.

    Ну это и так понятно. Я спрашивал к какому файлу относится ;)
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    2) может быть и сурс, и таргет, т.к. они оба открываются через NtCreateFile

    ЗЫ: А как ты при вызове одной функции получаешь две разные ошибки?
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    - блин че так нервничать вот исходник функции:
    Код (Text):
    1. BOOL STDCALL MoveFileExW (LPCWSTR   lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags)
    2. {
    3.     return MoveFileWithProgressW (lpExistingFileName,
    4.                                   lpNewFileName,
    5.                                   NULL,
    6.                                   NULL,
    7.                                   dwFlags);
    8. }
    9. BOOL
    10. STDCALL
    11. MoveFileWithProgressW (
    12.     LPCWSTR         lpExistingFileName,
    13.     LPCWSTR         lpNewFileName,
    14.     LPPROGRESS_ROUTINE  lpProgressRoutine,
    15.     LPVOID          lpData,
    16.     DWORD           dwFlags
    17.     )
    18. {
    19. .......Bla bla bla
    20.             if (folder==FALSE)
    21.         {
    22.             Result = CopyFileExW (lpExistingFileName,
    23.                               lpNewFileName,
    24.                               lpProgressRoutine,
    25.                               lpData,
    26.                               NULL,
    27.                               FileRename->ReplaceIfExists ? 0 : COPY_FILE_FAIL_IF_EXISTS);
    28.             if (Result)
    29.             {
    30.             /* Cleanup the source file */          
    31.                     Result = DeleteFileW (lpExistingFileName);
    32.             }
    33.                   }
    34.          else
    35.          {
    36.            /* move folder code start */
    37.            WIN32_FIND_DATAW findBuffer;
    38.            LPWSTR lpExistingFileName2 = NULL;
    39.            LPWSTR lpNewFileName2 = NULL;
    40.            LPWSTR lpDeleteFile = NULL;
    41.            INT size;
    42.            INT size2;
    43.            BOOL loop = TRUE;
    44.            BOOL Result = FALSE;
    45.            INT max_size = MAX_PATH;
    46.  
    47.  
    48.                    /* Build the string */
    49.            size = wcslen(lpExistingFileName);
    50.            if (size+6> max_size)
    51.                max_size = size + 6;
    52.  
    53.            lpDeleteFile = (LPWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,max_size * sizeof(WCHAR));
    54.            if (lpDeleteFile == NULL)           
    55.                return FALSE;                 
    56.  
    57.            lpNewFileName2 = (LPWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,max_size * sizeof(WCHAR));
    58.            if (lpNewFileName2 == NULL)
    59.            {       
    60.              HeapFree(GetProcessHeap(),0,(VOID *)  lpDeleteFile);
    61.              return FALSE;
    62.            }
    63.  
    64.            lpExistingFileName2 = (LPWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,max_size * sizeof(WCHAR));
    65.            if (lpNewFileName2 == NULL)
    66.            {       
    67.              HeapFree(GetProcessHeap(),0,(VOID *)  lpNewFileName2);                            
    68.              HeapFree(GetProcessHeap(),0,(VOID *) lpDeleteFile);       
    69.              return FALSE;
    70.            }                   
    71.        
    72.            wcscpy( (WCHAR *)lpExistingFileName2,lpExistingFileName);
    73.            wcscpy( (WCHAR *)&lpExistingFileName2[size],L"\\*.*\0");
    74.      
    75.            /* Get the file name */
    76.            memset(&findBuffer,0,sizeof(WIN32_FIND_DATAW));
    77.            hFile = FindFirstFileW(lpExistingFileName2,  &findBuffer); --- А ЭТО ЧЕ НЕ ПОИСК ФАЙЛА А?
    78.            if (hFile == NULL)
    79.                loop=FALSE;
    80. .....
    1ая Проблема. - описание в куске кода выше.
    2ая Проблема. gilg уже все сказал.
    Решение проблем: пиши свою функцию - тогда ты точно будешь знать причины.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Недавно заметил, что MoveFileEx не пашет на Windows 95. Поменял на DeleteFile + MoveFile. Видать, в реализации расширенной версии этой функции всегда были баги.
     
  7. Guest

    Guest Guest

    Публикаций:
    0
    - это точно, довольно зумудренный код MoveFileEx в таком точно можно что-нибудь забыть.