OK!
/****************多线程写文件的代码******************************/
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>static DWORD WINAPI _WriteFileThreadProc(LPVOID lpParam);typedef struct _FileObj
{
char buf[5];
char fileName[10];
DWORD nSleepTime;
}FileObj;int main()
{       
        FileObj f1,f2,f3;
strcpy(f1.buf,"abcd");
strcpy(f1.fileName,"1.txt");
strcpy(f2.buf,"efgh");
strcpy(f2.fileName,"2.txt");
strcpy(f3.buf,"1234");
strcpy(f3.fileName,"3.txt");
f1.nSleepTime = 10;
f2.nSleepTime = 20;
f3.nSleepTime = 150; HANDLE t1 = ::CreateThread(NULL, 0, _WriteFileThreadProc, &f1, 0, NULL);
Sleep(3);
HANDLE t2 = ::CreateThread(NULL, 0, _WriteFileThreadProc, &f2, 0, NULL);
Sleep(10);
HANDLE t3 = ::CreateThread(NULL, 0, _WriteFileThreadProc, &f3, 0, NULL);
Sleep(2); ::WaitForSingleObject(t1,INFINITE);
::WaitForSingleObject(t2,INFINITE);
::WaitForSingleObject(t3,INFINITE); ::CloseHandle(t1);
::CloseHandle(t2);
::CloseHandle(t3); return 1;
}DWORD WINAPI _WriteFileThreadProc(LPVOID lpParam)
{
        HANDLE hFile; hFile = ::CreateFile(((FileObj*)lpParam)->fileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);

if(hFile == INVALID_HANDLE_VALUE)
{
return GetLastError();
} DWORD nWriteNum; for(DWORD i = 0;i < 911111420;i++)
{
::WriteFile(hFile,((FileObj*)lpParam)->buf,
strlen(((FileObj*)lpParam)->buf),&nWriteNum,NULL);
//Sleep(((FileObj*)lpParam)->nSleepTime);
} ::CloseHandle(hFile); return 1;}/**************************目录删除算法***********************************/
BOOL CDiskManager::DeleteNotEmptyWorkDirectory(LPCTSTR lpPathaName)
{
CFileFind ff;
CString strPath = lpPathaName; if(strPath.Right(1) != "\\")
{
strPath += "\\";
}
strPath += "*.*";
BOOL bRet; if(ff.FindFile(strPath))
{
do 
{
bRet = ff.FindNextFile();
if(ff.IsDots())
{
continue;
}
strPath = ff.GetFilePath();
if(!ff.IsDirectory())
{
::SetFileAttributes(strPath,FILE_ATTRIBUTE_NORMAL);
::DeleteFile(strPath);
}
else
{
DeleteNotEmptyWorkDirectory(strPath);
::SetFileAttributes(strPath,FILE_ATTRIBUTE_NORMAL);
::RemoveDirectory(strPath);
}
} while (bRet);
}

return TRUE;
}
谢谢大家的帮忙~~

解决方案 »

  1.   


    谢谢scq2099yt的解答删除文件(确切说是删除某一文件夹下的所有文件)时确实有线程在写文件,可是删除的文件并不是写的文件啊,并且二者也不存在重叠包含关系,删除的文件和写入的文件位于不同的分区中也会出错,为什么呢?
      

  2.   

    注意两个问题:
    1、不要删除程序运行的当前目录;
    2、FindFile后要close才能删除被Find的目录。
      

  3.   


    谢谢cnzdgs还是有些不太明白,运行的程序位于 工程名/debug/下,那您指的是不要删除这个目录吗?
    我删除的目录在另一个分区上有时也会出现报错~如果FindFile后不Close会有什么现象呢?
      

  4.   

    程序的当前目录是可以通过SetCurrentDirectory来改变的,如果是debug,就不要删除debug。
    FindFile会打开一个句柄(其实就是打开了被查找的目录),这个句柄如果不关则无法删除这个目录,就如同不能删除一个已打开的文件(非共享删除)一样。CFileFind类有一个Close函数,就是关闭句柄用的。
      

  5.   


    谢谢 cnzdgs,又学到了很多东西