Office(Word, Excel, PowerPoint)에서 최근 문서 주소가 존재하지 않는 Recent Document 파일 삭제

4421 단어 등록표 삭제
최근에 Office(Word, Excel, PowerPoint)에서 Recent Document의 최근 문서 주소에 존재하지 않는 파일, 즉 매번 Office(Word, Excel, PowerPoint)를 열 때마다 Recent Document의 일부 파일의 주소가 이미 효력을 상실한 것을 발견하고 (이동 또는 삭제), 어떻게 이런 잘못된 파일을 삭제하는지, 여기에서 나의 방법, 사고방식과 부딪힌 문제와 해결 과정을 기록합니다.
1. 등록표를 통해 Office(Word, Excel, PowerPoint)에서 Recent Document에 해당하는 위치를 찾습니다. 여기서 Word를 예로 들면 최근 파일에는 file1, file2, file3이 있습니다. 열려 있는 위치는 (C:\Test\file1.doc, C:\Test\file2.doc, C:\Test\file3.doc)입니다.
//OpenSubKey(param1,param2),param1 ,param2 true Write 
//version Word(Excel,PowerPoint) , 2013 , 15.0
//officeType Office , Word
RegistryKey userMRU = Registry.CurrentUser.OpenSubKey(string.Format("Software\\Microsoft\\Office\\{0}\\{1}\\User MRU", version, officeType), true);

2. 레지스트리 User MRU 디렉터리 아래는 Word의 모든 사용자의 정보입니다. 그 중에서 Recent Document는 해당 사용자의 하위 디렉터리에 저장됩니다.
                // userMRU name, 
                string[] directoryNames = userMRU.GetSubKeyNames();
                // File MRU 
                foreach (string directoryName in directoryNames)
                {
                    RegistryKey userMRUSubDirectory = userMRU.OpenSubKey(directoryName, true);
                    RegistryKey fileMRU = userMRUSubDirectory.OpenSubKey("File MRU", true);
                }

3. fileMRU 아래의 키와value를 얻어value에 저장된 파일 경로가 존재하는지 판단해야 한다
// fileMRU key Name, item1,item2,item3
string[] fileTitles = fileMRU.GetValueNames();
// key value, [F00000000][T01D45490CE43CA41][O00000000]*C:\Test\File1.doc
//* , * 
string fileValue = fileMRU.GetValue(fileTitles[i]).ToString();
string[] fileValues = fileValue.Split('*');
// fileValues[fileValues.Length-1] 
// fileValues[1] , value value , 
                        if (!File.Exists(fileValues[fileValues.Length-1]))
                        {
                            
                        }

4. 다음은 파일 경로 아래에 파일이 존재하지 않을 때 어떻게 수정해야 하는가
(생각1) 처음에는 키를 직접 삭제하고 file2가 존재하지 않는 것을 발견하고 item2를 삭제하며 f5를 새로 고치면 등록표에 item1과 item3만 있는 것을 발견하고 삭제하는 데 성공한 것 같지만 워드 도구를 열면 최근 문서에 item1에 대응하는 file1만 있는 것을 발견할 수 있다.등록표에서 item3를 읽을 수 없습니다.(여기 간단하게 제 개인적인 이해를 말씀드리자면 최근 문서에 item1, 대응 파일 file1, 등록표는 키:item1,value:string*file1의 경로가 있습니다. 이때 워드가 파일을 열면 최근 문서에 file2가 추가됩니다. 등록표는 키:item1,value:string*file2의 경로가 됩니다. 키:item2,value:string*file1의 경로는 워드가 등록표에서 키를 위에서 아래로 읽는 것을 이해할 수 있습니다.키 하나가 없으면 뒤에 있는 키를 계속 읽지 않는다)
// file2 key
fileMRU.DeleteValue(fileTitles[i]);

(사상2) 키를 직접 삭제하면 안 된다. 그러면 키의 값을 바꾸어 비워 두어라. 고친 후word를 열면 정상적으로 읽을 수 있다. 그러나 여기에도 위험이 하나 남아 있다. 등록표에는 키가 세 개 있고 Recent Document는 두 개의 파일 file1, file3만 있다.file2는 존재하지 않지만 키를 차지하고 있습니다. 관건은 어느 키의 자원을 차지하고 있는지 모르는 것입니다. file2와 같은 실효 파일이 늘어나면서 무서운 일이 발생할 수 있습니다.
// file2 key 
fileMRU.SetValue(fileTitles[i],"");

(사상3) item2에서value를 이미 존재하는 item3에서 유효한value로 바꾸고 뒤에 있는 item3를 삭제하면 문제를 완벽하게 해결할 수 있다
string[] fileTitles = fileMRU.GetValueNames();
                    // tempLength key , key 
                    //  
                    // , item3,item2,item1, key,                         
                    //key( ) value key, key                   
                    int tempLength = fileTitles.Length;
                    for (int i = tempLength-1; i >= 0; i--)
                    {
                        string fileValue = fileMRU.GetValue(fileTitles[i]).ToString();
                        string[] fileValues = fileValue.Split('*');
                        if (!File.Exists(fileValues[fileValues.Length-1]))
                        {
                            try
                            {                                
                                for (int j = i + 1; j < tempLength; j++)
                                {
                                    string value = fileMRU.GetValue(fileTitles[j]).ToString();
                                    fileMRU.SetValue(fileTitles[j - 1], value);
                                }
                                fileMRU.DeleteValue(fileTitles[tempLength-1]);
                                tempLength--;
                            }
                            catch (System.Exception ex)
                            {
                                // 
                            }
                        }
                    }                     

5. 문제 해결, 코드 제출

좋은 웹페이지 즐겨찾기