티스토리 뷰

그리고 많은 것들과 마찬가지로 그 답 은 10 년 전의 C ++ / Win32 프로그래밍에 관한 기사에 있습니다.

간단히 말해서 문제는 Windows가 플로피 디스크 오류를 다른 종류의 드라이브 오류와 약간 다르게 처리한다는 것입니다. 기본적으로, 아니 당신이 프로그램이하는, 또는 어떤 문제가 있다고 생각 은하고있어, Windows가 장치에 의해 슬로우 오류를 차단하지 않으며 오히려 프로그램 핸들이 것보다도 사용자에게 대화 상자를 표시합니다 - 내가 가진 된 정확한 문제를.

하지만이 문제를 해결하기위한 Win32 API 호출이 있습니다. SetErrorMode()

간단히 말해서 (그리고 여기에서 많은 세부 정보를 손으로 흔드는 중입니다) SetErrorMode()Windows가 너무 편집증 적이 지 않게하고, 우리의 일을하고, 프로그램이 상황을 처리하도록 한 다음 Windows 오류 모드를 재설정하는 데 사용할 수 있습니다. 마치 우리가 그곳에 가본 적이없는 것처럼 이전 상태로 돌아갑니다. (아마 여기에 Keyser Soze 농담이 있지만, 오늘 카페인을 찾을 수있을만큼 잘못된 양의 카페인을 섭취했습니다.)

링크 된 기사의 C ++ 샘플 코드를 수정하면 다음과 같습니다.

int OldMode; //a place to store the old error mode
//save the old error mode and set the new mode to let us do the work:
OldMode = SetErrorMode(SEM_FAILCRITICALERRORS); 
// Do whatever we need to do that might cause an error
SetErrorMode(OldMode); //put things back the way they were

C ++에서 올바른 방법으로 오류를 감지하려면`GetLastError () '함수가 필요합니다.이 함수는 Python 질문이므로 여기서는 걱정할 필요가 없습니다. 우리의 경우 Python의 예외 처리가 잘 작동합니다. 이것은 내가 드라이브 문자의 "준비"를 확인하기 위해 함께 두드린 기능이며, 다른 사람이 필요로하는 경우 복사하여 붙여 넣을 준비가되었습니다.

import win32api
def testDrive( currentLetter ):
    """
        Tests a given drive letter to see if the drive is question is ready for 
            access. This is to handle things like floppy drives and USB card readers
                which have to have physical media inserted in order to be accessed.
                    Returns true if the drive is ready, false if not.
                        """
                            returnValue = False
                                #This prevents Windows from showing an error to the user, and allows python 
                                    #to handle the exception on its own.
                                        oldError = win32api.SetErrorMode( 1 ) #note that SEM_FAILCRITICALERRORS = 1
                                            try:
                                                    freeSpace = win32file.GetDiskFreeSpaceEx( letter )
                                                        except:
                                                                returnValue = False
                                                                    else:
                                                                            returnValue = True
                                                                                #restore the Windows error handling state to whatever it was before we
                                                                                    #started messing with it:
                                                                                        win32api.SetErrorMode( oldError )
                                                                                            return returnValue
                                                                                            

나는 지난 며칠 동안 이것을 꽤 많이 사용해 왔으며 플로피와 USB 카드 리더 모두에서 아름답게 작동했습니다.

몇 가지 참고 사항 : 디스크 액세스가 필요한 거의 모든 기능이 try 블록에서 작동합니다. 미디어가 존재하지 않기 때문에 예외에서 찾고있는 모든 것입니다.

또한 파이썬 win32api패키지는 우리가 필요로하는 모든 함수를 노출하지만 플래그 상수가없는 것 같습니다. MSDN의 고대 창자를 방문한 후 SEM_FAILCRITICALERRORS가 1과 같아서 우리의 삶을 매우 쉽게 만듭니다.

비슷한 문제가있는 다른 사람에게 도움이되기를 바랍니다.

-------------------

len(os.listdir("path"))0 과 비교 하여 디렉토리에 파일이 있는지 확인할 수 있습니다 .

-------------------

pythonwin 있는 경우이 레시피 의 정보가 도움이됩니까?

추측에 따르면 "가용성"및 "상태"는 살펴볼 가치가 있습니다. 또는 드라이브에 아무것도 없으면 'X :'또는 ''가 될 볼륨 이름을 테스트 할 수 있습니다. 또는 여유 공간이나 총 블록 수를 찾으십시오.

-------------------

이를 위해 우수한 pywin32 ( http://sourceforge.net/projects/pywin32/ )를 통해 win32 기능을 사용할 수 있습니다 .

GetDiskFreeSpace기능을 살펴 보는 것이 좋습니다 . 대상 드라이브의 여유 공간을 확인하고 해당 정보를 기반으로 계속할 수 있습니다.

대안으로 ReadDirectoryChangesW함수를 사용하여 디렉토리 또는 파일의 변경 사항을 볼 수 있습니다 . 파일 변경 등에 대한 알림을 받게됩니다.하지만 이것이 당신에게 맞는지 확인해야합니다. 이 예제를 직접 볼 수 있습니다. http://timgolden.me.uk/python/downloads/watch_directory.py

-------------------

플랫폼에 대해서는 확실하지 않지만 SNMP 가 답이 될 수 있습니다.



출처
https://stackoverflow.com/questions/1902872
댓글
공지사항
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31