2014-04-17 2 views
2

내 프로그램을 Windows 시스템의 모든 드라이브를 반복하고 특정 파일 형식을 검색하고 싶습니다. 지금 당장은 프로그램을 실행하고 드라이브 문자를 전달할 수 있지만 모든 드라이브를 자동으로 검색하려고합니다. 현재, 나는 같은 것을 할 필요가있을 것이다 :golang을 사용하여 Windows에서 모든 드라이브 목록을 얻으려면 어떻게합니까?

C:\> program.exe C: 
C:\> program.exe D: 
C:\> program.exe E: 

내가 원하는 프로그램을 드라이브 문자를 지정하는 데 사용하지 않고 그들 모두를 통해 모든 드라이브의 목록을 얻을 반복. Go를 사용하여이 작업을 수행 할 수 있습니까? 이 질문에 Listing All Physical Drives (Windows) 유사 대신 C.

+1

왜'/ * 드라이브에 대한 몇 가지 연산을 시도하고 실패에 계속 {_ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"에서 운전에 대한 * /}'? – Volker

+0

cgo를 사용하여 Go의 C API를 사용하십시오. – rightfold

+0

@Volker 더 좋은 방법을 찾고 있었습니까? – roartechs

답변

4

easist 방법의 이동을 사용하여

은 볼커 언급 "드라이브"폴더를 열려고와 자신의 함수를 작성합니다.

import "os" 

func getdrives() (r []string){ 
    for _, drive := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ"{ 
     _, err := os.Open(string(drive)+":\\") 
     if err == nil { 
      r = append(r, string(drive)) 
     } 
    } 
    return 
} 
+0

더 좋은 방법이있는 것 같지 않으므로이 대답을 수락하십시오. – roartechs

+1

일부 시스템에서 지연이 발생할 수 있습니다. DVD 드라이브가 회전 할 때까지 기다리는 중입니다. 플로피가 삽입되지 않았을 때 A : 드라이브를 클릭하는 것이 어떻게 느려지는지 기억합니다 ... – RichVel

+1

열린 파일들을'Close()'해야합니까? – Matt

4

당신은 기능 GetLogicalDrivescall 및 비트 맵에 따라 문자를 일치시킬 수 있습니다.

package main 

import (
    "akori/files/utils/fs" 
    "fmt" 
    "syscall" 
) 

func main() { 

    kernel32, _ := syscall.LoadLibrary("kernel32.dll") 
    getLogicalDrivesHandle, _ := syscall.GetProcAddress(kernel32, "GetLogicalDrives") 

    var drives []string 

    if ret, _, callErr := syscall.Syscall(uintptr(getLogicalDrivesHandle), 0, 0, 0, 0); callErr != 0 { 
     // handle error 
    } else { 
     drives = bitsToDrives(uint32(ret)) 
    } 

    fmt.Printf("%v", drives) 

} 

func bitsToDrives(bitMap uint32) (drives []string) { 
    availableDrives := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"} 

    for i := range availableDrives { 
     if bitMap & 1 == 1 { 
      drives = append(drives, availableDrives[i]) 
     } 
     bitMap >>= 1 
    } 

    return 
} 
4

또는 직접에서는 GetLogicalDriveStrings를 호출 할 수 있습니다 :

뭔가 같은

package main 

import (
    "fmt" 
    "syscall" 
    "unsafe" 
) 

func main() { 
    kernel32, err := syscall.LoadDLL("kernel32.dll") 
    getLogicalDriveStringsHandle, err := kernel32.FindProc("GetLogicalDriveStringsA") 

    buffer := [1024]byte{} 
    bufferSize := uint32(len(buffer)) 
    drives := []string{} 

    hr, _, _ := getLogicalDriveStringsHandle.Call(uintptr(unsafe.Pointer(&bufferSize)), uintptr(unsafe.Pointer(&buffer))) 
    if hr == 0 { 
     fmt.Print("There was an error") 
    } else { 
     // Deal with the buffer, you need to split it 
    } 
} 
+0

Call의 첫 번째 매개 변수는'unitptr (bufferSize)'이어야하며'uintptr (unsafe.Pointer (& bufferSize)) '이 아니어야합니다. –

관련 문제