唉,很多的东西虽然不难,可是阵阵写起来发现总会出现这样,那样的问题。调试老是会出问题。下面是给同学写的修改文件属性的例子。 程序功能:修改文件(文件夹)的属性(隐藏,只读,存档,创建时间,最后访问时间,最后修改时间) //选择文件(目录)路径 void CCheckAttrDlg::OnBnClickedPath() { BROWSEINFO stBrInfo = {0}; LPITEMIDLIST pstLsItem = NULL; char szPath[MAX_PATH] = {0}; CString str; CString strPath; DWORD dwAttr = 0; int nPos = 0; memset(&stBrInfo, 0, sizeof(stBrInfo)); stBrInfo.hwndOwner = m_hWnd; stBrInfo.pidlRoot = NULL; stBrInfo.pszDisplayName = NULL; stBrInfo.lpszTitle = "请选择需要操作的文件(目录)"; stBrInfo.ulFlags = BIF_BROWSEINCLUDEFILES; stBrInfo.lpfn = NULL; stBrInfo.iImage = 0; stBrInfo.lParam = 0; pstLsItem = SHBrowseForFolder(&stBrInfo); if (NULL != pstLsItem) { SHGetPathFromIDList(pstLsItem, szPath); } else { return; } m_strPath = szPath; UpdateData(FALSE); //设置选择的属性 OnBnClickedBtnGetAttr(); } //获取文件(目录)属性 void CCheckAttrDlg::OnBnClickedBtnGetAttr() { UpdateData(TRUE); CString str; DWORD dwAttr = GetFileAttributes(m_strPath); if (INVALID_FILE_ATTRIBUTES == dwAttr) { str.Format("%s 不存在!"); m_stFileStyle.SetWindowText(str); MessageBox(str); return; } if (FILE_ATTRIBUTE_DIRECTORY & dwAttr) { m_bDir = TRUE; str.Format("文件类型: 目录"); m_stFileStyle.SetWindowText(str); } else { m_bDir = FALSE; str.Format("文件类型: 普通文件"); m_stFileStyle.SetWindowText(str); } if (FILE_ATTRIBUTE_HIDDEN & dwAttr) { m_bHide = TRUE; } else { m_bHide = FALSE; } if (FILE_ATTRIBUTE_READONLY & dwAttr) { m_bReadOnly = TRUE; } else { m_bReadOnly = FALSE; } if (FILE_ATTRIBUTE_COMPRESSED & dwAttr) { m_bSave = TRUE; } else { m_bSave = FALSE; } //get file time system FILETIME ftCreate; FILETIME ftLastVisit; FILETIME ftFix; FILETIME ftLocal; SYSTEMTIME syTime; HANDLE hFile = INVALID_HANDLE_VALUE; dwAttr = 0; if (m_bDir) { dwAttr = FILE_FLAG_BACKUP_SEMANTICS; } else { dwAttr = FILE_ATTRIBUTE_NORMAL; } hFile = CreateFile(m_strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, dwAttr, NULL); if (INVALID_HANDLE_VALUE == hFile) { return; } GetFileTime(hFile, &ftCreate, &ftLastVisit, &ftFix); memset(&syTime, 0, sizeof(&syTime)); memset(&ftLocal, 0, sizeof(&ftLocal)); FileTimeToLocalFileTime(&ftCreate,&ftLocal); FileTimeToSystemTime(&ftLocal, &syTime); str.Format("%u/%u/%u %u:%u:%u", syTime.wYear, syTime.wMonth, syTime.wDay, syTime.wHour, syTime.wMinute, syTime.wSecond); m_strCreateTime = str; memset(&syTime, 0, sizeof(syTime)); FileTimeToLocalFileTime(&ftFix,&ftLocal); FileTimeToSystemTime(&ftLocal, &syTime); str.Format("%u/%u/%u %u:%u:%u", syTime.wYear, syTime.wMonth, syTime.wDay, syTime.wHour, syTime.wMinute, syTime.wSecond); m_strFixTime = str; memset(&syTime, 0, sizeof(syTime)); FileTimeToLocalFileTime(&ftLastVisit,&ftLocal); FileTimeToSystemTime(&ftLocal, &syTime); str.Format("%u/%u/%u %u:%u:%u", syTime.wYear, syTime.wMonth, syTime.wDay, syTime.wHour, syTime.wMinute, syTime.wSecond); m_strLastVisitTime = str; UpdateData(FALSE); CloseHandle(hFile); } //设置文件(目录)属性 void CCheckAttrDlg::OnBnClickedBtnSetAttr() { UpdateData(TRUE); CString str; BOOL bExist = FALSE; DWORD dwAttr = INVALID_FILE_ATTRIBUTES; DWORD dwOpen = OPEN_EXISTING; if (m_strLastVisitTime.IsEmpty() || m_strFixTime.IsEmpty() || m_strCreateTime.IsEmpty()) { MessageBox("设置文件的时间不能为空!"); return; } dwAttr = GetFileAttributes(m_strPath); if (INVALID_FILE_ATTRIBUTES == dwAttr) //如果文件不存在则默认为普通文件并创建该文件 { dwAttr = 0; bExist = FALSE; m_bDir = FALSE; //设置文件类型 str.Format("文件类型: 普通文件"); m_stFileStyle.SetWindowText(str); dwAttr = FILE_ATTRIBUTE_NORMAL; } else { bExist = TRUE; //设置文件类型 if (FILE_ATTRIBUTE_DIRECTORY & dwAttr) { m_bDir = TRUE; str.Format("文件类型: 目录"); m_stFileStyle.SetWindowText(str); } else { m_bDir = FALSE; str.Format("文件类型: 普通文件"); m_stFileStyle.SetWindowText(str); } } if (m_bHide) { dwAttr |= FILE_ATTRIBUTE_HIDDEN; } else { dwAttr &= (~FILE_ATTRIBUTE_HIDDEN); } //去掉只读属性 dwAttr &= (~FILE_ATTRIBUTE_READONLY); if (m_bSave) { dwAttr |= FILE_ATTRIBUTE_COMPRESSED; } else { dwAttr &= FILE_ATTRIBUTE_COMPRESSED; } //设置文件属性 SetFileAttributes(m_strPath, dwAttr); //get file time system FILETIME ftCreate; FILETIME ftLastVisit; FILETIME ftFix; FILETIME ftLocal; SYSTEMTIME syTime; HANDLE hFile = INVALID_HANDLE_VALUE; dwAttr = 0; if (m_bDir) { dwAttr = FILE_FLAG_BACKUP_SEMANTICS; } else { dwAttr = FILE_ATTRIBUTE_NORMAL; } if (bExist) { dwOpen = OPEN_EXISTING; } else { dwOpen = CREATE_ALWAYS; } hFile = CreateFile(m_strPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, dwOpen, dwAttr, NULL); if (INVALID_HANDLE_VALUE == hFile) { MessageBox("输入的路径无效!"); return; } memset(&syTime, 0, sizeof(&syTime)); memset(&ftLocal, 0, sizeof(ftLocal)); sscanf(m_strCreateTime, "%u/%u/%u %u:%u:%u", &syTime.wYear, &syTime.wMonth, &syTime.wDay, &syTime.wHour, &syTime.wMinute, &syTime.wSecond); SystemTimeToFileTime(&syTime, &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftCreate); memset(&syTime, 0, sizeof(&syTime)); memset(&ftLocal, 0, sizeof(ftLocal)); sscanf(m_strFixTime, "%u/%u/%u %u:%u:%u", &syTime.wYear, &syTime.wMonth, &syTime.wDay, &syTime.wHour, &syTime.wMinute, &syTime.wSecond); SystemTimeToFileTime(&syTime, &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftFix); memset(&syTime, 0, sizeof(&syTime)); memset(&ftLocal, 0, sizeof(ftLocal)); sscanf(m_strLastVisitTime, "%u/%u/%u %u:%u:%u", &syTime.wYear, &syTime.wMonth, &syTime.wDay, &syTime.wHour, &syTime.wMinute, &syTime.wSecond); SystemTimeToFileTime(&syTime, &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftLastVisit); SetFileTime(hFile, &ftCreate, &ftLastVisit, &ftFix); CloseHandle(hFile); if (m_bReadOnly) { dwAttr = GetFileAttributes(m_strPath); dwAttr |= FILE_ATTRIBUTE_READONLY; SetFileAttributes(m_strPath, dwAttr); } MessageBox("设置文件属性成功!"); }