Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дефрагментация и проверка диска, Пример 
:(
    Опции темы
Softaz
Дата 3.3.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 2
Всего: 16



Вот здесь случайно ответил (http://forum.vingrad.ru/topic-45991.html), не посмотрев, что тема в Delphi.
Ссылки, которые p0s0l дал, умерли.

Цитата(p0s0l @  20.3.2005,  22:13 Найти цитируемый пост)
Тут описан принцип и есть исходник на сях:http://www.sysinternals.com/ntw2k/info/defrag.shtml  Добавлено @ 22:16 Еще один линк (исходники не смотрел... но возможно с комментариями на русском): http://www.mtu-net.ru/pinetar/dm/comp_ntfs_frag.htmТолько тут сказано, что не очень рабочий дефрагментатор Также там сказано про одну корявую особенность Defragmentation API...


Возникла подобная проблема. Надо узнать, как делать дефрагментацию и проверку диска.
Есть ли у Вас информация или исходник.


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
vinter
Дата 3.3.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



рабочий консольный дефрагментатор, для FAT
только доработай с именами файлов которые необходимо дефрагментировать, т.к у меня тут два статических имени..
Код

#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winioctl.h> 
#include <TCHAR.h>
 
PRETRIEVAL_POINTERS_BUFFER GetFileMap(LPCSTR lpSrcName);
void Defrag(PCHAR lpSrcName);
PVOLUME_BITMAP_BUFFER MyGetVolume(LPCSTR lpSrcName);
 
ULONG nClCount;
_int64 nStartLCN;
_int64 nPrevVCN;
ULONG nClusterSize;
PRETRIEVAL_POINTERS_BUFFER OutBuf;
 
int main(int argc, char *argv[])
{
    argc = 2;
    argv[1] = "C:\\LBA\\LBA_BRK.HQR";
    if (argc > 1)
    {
        Defrag(argv[1]);
    }
    return 0;
}
 
PRETRIEVAL_POINTERS_BUFFER GetFileMap(LPCSTR lpSrcName)
{
    ULONG nBlockSize = 0;
    ULONG nFileSize = 0;
    HANDLE hFile = 0;
    ULONG nSecPerCl, nBtPerSec;
    ULONG   nOutSize = 0;
    DWORD nBytes;
    ULONG nCls = 0;
    _int64 *pClusters = NULL;
    BOOLEAN bResult = FALSE;
    LARGE_INTEGER PrevVCN, LCN;
    STARTING_VCN_INPUT_BUFFER  InBuf;
    hFile = CreateFile(lpSrcName, FILE_READ_ATTRIBUTES,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL, OPEN_EXISTING, 0, 0);
    char  Name[3];
    Name[0] = lpSrcName[0];
    Name[1] = ':';
    Name[2] = 0;
    GetDiskFreeSpace(Name, &nSecPerCl, &nBtPerSec, NULL, NULL);
    nClusterSize = nSecPerCl * nBtPerSec;
    if (hFile != INVALID_HANDLE_VALUE)
    {
        nFileSize = GetFileSize(hFile, NULL);
        nOutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (nFileSize / nClusterSize) 
            * sizeof(OutBuf->Extents);
        OutBuf = new RETRIEVAL_POINTERS_BUFFER[nOutSize];
        InBuf.StartingVcn.QuadPart = 0;
        if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf, 
            sizeof(InBuf), OutBuf, nOutSize, &nBytes, NULL))
            nClCount = (nFileSize + nClusterSize - 1) / nClusterSize;
        //    pClusters = new _int64[nClCount];
        nPrevVCN = OutBuf->StartingVcn.QuadPart;
            /*
            for (ULONG i = 0, Cls = 0; i < OutBuf->ExtentCount; i++)
            {
                LCN = OutBuf->Extents[i].Lcn;
                for (int j = (ULONG)(OutBuf->Extents[i].NextVcn.QuadPart - PrevVCN.QuadPart);
                    j > 0; j--, nCls++, LCN.QuadPart++) 
                    *(pClusters + Cls) = LCN.QuadPart;
                    PrevVCN = OutBuf->Extents[i].NextVcn;
            }*/
    
        
    }
    CloseHandle(hFile);
    return OutBuf;
}
PVOLUME_BITMAP_BUFFER MyGetVolume(LPCSTR lpSrcName)
{
    
    HANDLE hFile = 0;    
    DWORD pBytes;    
    int ret = 0;    
    _int64 nOutSize = 0;    
    _int64 NumberOfClusters = 0;    
    _int64 nHelpLCN = 0;
    _int64 nEmptyCluster = 0;
    STARTING_LCN_INPUT_BUFFER  InBuf;    
    PRETRIEVAL_POINTERS_BUFFER FileMap = GetFileMap(lpSrcName);
    VOLUME_BITMAP_BUFFER  OutBuf;    
    PVOLUME_BITMAP_BUFFER  pOutBuf = &OutBuf;    
    hFile = CreateFile("\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
        OPEN_EXISTING, 0, 0);    
    if ( hFile == INVALID_HANDLE_VALUE )    
    {    
        // не открылся    
        return 0;    
    }    
    nOutSize = sizeof(VOLUME_BITMAP_BUFFER);    
    InBuf.StartingLcn.QuadPart = 0;    
    // отдаем маленький буфер (1 байт под данные карты)    
    ret = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf),    
        pOutBuf, nOutSize, &pBytes, NULL);    
    if ( !ret && GetLastError() == ERROR_MORE_DATA )    
    {    
        // получаем кол-во кластеров на томе (начиная с StartingLcn)    
        NumberOfClusters = pOutBuf->BitmapSize.QuadPart - pOutBuf->StartingLcn.QuadPart;    
        // вычисляем, сколько нужно байт под буфер (1 кластер = 1 бит)    
        nOutSize = NumberOfClusters/sizeof(char) + sizeof(VOLUME_BITMAP_BUFFER);    
        // выделяем-с...    
        pOutBuf = (PVOLUME_BITMAP_BUFFER)new char[nOutSize];    
        if (!pOutBuf)    
        {    
            // не выделилось... диск большой =)    
            return pOutBuf;    
        }    
        pOutBuf->StartingLcn.QuadPart = 0; // буфер новый - зададим начало    
        ret = DeviceIoControl(hFile, FSCTL_GET_VOLUME_BITMAP, &InBuf, sizeof(InBuf),    
            pOutBuf, nOutSize, &pBytes, NULL);    
        int nMask = 1;
        int nInUse = 0;
        if ( ret )    
        {    
            for(_int64 i = 0; i < pOutBuf->BitmapSize.QuadPart; i++)
            {
                if(nStartLCN > 7500)
                    int k = 73824;
                if(pOutBuf->Buffer[i] == 255)
                {
                    nStartLCN += 8;
                    nEmptyCluster = 0;
                    continue;
                }
                
                while(nMask != 256)
                {
                    if(!nEmptyCluster)
                        nHelpLCN = nStartLCN;
                    nInUse = pOutBuf->Buffer[i] & nMask;
                    if(!nInUse)
                        nEmptyCluster++;
                    else
                        nEmptyCluster = 0;
                    nMask <<= 1; 
                    nStartLCN++;
                }
                if(nEmptyCluster >= nClCount)
                {
                    nStartLCN = nHelpLCN;
                    break; 
                }
                nMask = 1;
            }
            CloseHandle( hFile );
            return pOutBuf;
        }    
        else    
        {    
            // хм. ошибка...    
            ret = GetLastError();    
        }    
    }    
    
    return 0;
}
 
void Defrag(PCHAR lpSrcName)
{
    ULONG nClCount = 0;
    HANDLE hDrive = 0;
    HANDLE hFile = 0;
    PVOLUME_BITMAP_BUFFER pOutBuf = MyGetVolume(lpSrcName);
    MOVE_FILE_DATA InBuffer;
    DWORD nBytes = 0;
    _int64 *pClusters = NULL;
    BOOLEAN bResult = FALSE;
    char  Name[3];
    Name[0] = lpSrcName[0];
    Name[1] = ':';
    Name[2] = 0;
    hFile = CreateFile(lpSrcName, FILE_READ_ATTRIBUTES,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL,OPEN_EXISTING, FILE_FLAG_NO_BUFFERING,NULL);
    hDrive = CreateFile("\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                OPEN_EXISTING, 0, 0);    
        InBuffer.FileHandle = hFile;
        InBuffer.StartingLcn.QuadPart = nStartLCN;
        for(int k = 0; k < OutBuf->ExtentCount; k++)
        {
            InBuffer.StartingVcn.QuadPart = nPrevVCN;
            InBuffer.ClusterCount = OutBuf->Extents[k].NextVcn.QuadPart - nPrevVCN;
            int i = DeviceIoControl(hDrive, FSCTL_MOVE_FILE, &InBuffer, 
                sizeof(InBuffer), NULL, NULL, &nBytes, NULL);
            i = GetLastError();
            InBuffer.StartingLcn.QuadPart += InBuffer.ClusterCount;    
            nPrevVCN = OutBuf->Extents[k].NextVcn.QuadPart;
        }
        CloseHandle(hDrive);
}



--------------------
Мой блог
PM MAIL WWW   Вверх
Softaz
Дата 3.3.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 2
Всего: 16



vinter, спасибо. Сейчас посмотрю.


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
vova_km
Дата 11.5.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.10.2007
Где: УКРАЇНА, Запоріжж я

Репутация: нет
Всего: нет



Здравствуйте!
Подскажите пожалуйся где можно почитать теоретическую инфу, т.к. функции пока-что для меня "сухие". Хотелось бы понять алгоритм и написать самому.
PM MAIL ICQ   Вверх
dumb
Дата 11.5.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Defragmenting Files - описания control-code'ов вполне достаточно.
можно погуглить по кодам.
для полного погружения на страничке Rouse возьми "Windows NT. File System Internals. A Developer's Guide."
PM MAIL   Вверх
andrew_121
Дата 14.5.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Вот очень даже рабочий. На сях.
http://ultradefrag.sourceforge.net/


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
vova_km
Дата 19.5.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.10.2007
Где: УКРАЇНА, Запоріжж я

Репутация: нет
Всего: нет



а в чем будут состоять отличия этого дефрагментатора и Для NTFS?

Это сообщение отредактировал(а) vova_km - 19.5.2009, 16:29
PM MAIL ICQ   Вверх
andrew_121
Дата 19.5.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



vova_km, Какого этого?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
vova_km
Дата 19.5.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.10.2007
Где: УКРАЇНА, Запоріжж я

Репутация: нет
Всего: нет



Цитата

рабочий консольный дефрагментатор, для FAT
только доработай с именами файлов которые необходимо дефрагментировать, т.к у меня тут два статических имени..


который во втором посте
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0945 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.