Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI, C++] GetOpenFileName - jak odczytać wszystkie wybrane pliku?

Ostatnio zmodyfikowano 2011-08-26 15:33
Autor Wiadomość
Dawidsoni
Temat założony przez niniejszego użytkownika
[WinAPI, C++] GetOpenFileName - jak odczytać wszystkie wybrane pliku?
» 2011-08-26 11:32:27
Witam. Skoro to nie ma nic wspólnego z ostatnim tematem i został on zamknięty to zakładam nowy temat.
Mam 1 pytanie. Jak mogę poznać nazwy plików wczytanych w oknie dialogowym? Robię tak:
C/C++
ofn.lpstrFile = sNazwaPliku;
Jak mam 1 plik wczytany wszystko jest dobrze (nie mam flagi OFN_ALLOWMULTISELECT). Zmienna = ścieżce do pliku.
Jednak jak mam kilka plików to zmienna wygląda tak:
C:\Users\Samsung\Documents, czyli jest to folder, w którym są nazwy plików, które wybrałem. A skąd mogę poznać nazwy wybranych plików?
P-39964
DejaVu
» 2011-08-26 12:19:21
Czytałeś dokumentację?

/edit:
Google:
http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/828d548e-2c9b-460f-8138-339e2d557878

C/C++
/ Create dialog to open multiple files.
CFileDialog dlg( TRUE, _T( "txt" ), _T( "*.txt" ), OFN_ALLOWMULTISELECT );

// Create buffer for file names.
const DWORD numberOfFileNames = 100;
const DWORD fileNameMaxLength = MAX_PATH + 1;
const DWORD bufferSize =( numberOfFileNames * fileNameMaxLength ) + 1;
TCHAR * filenamesBuffer = new TCHAR[ bufferSize ];

// Initialize beginning and end of buffer.
filenamesBuffer[ 0 ] = NULL;
filenamesBuffer[ bufferSize - 1 ] = NULL;

// Attach buffer to OPENFILENAME member.
dlg.m_ofn.lpstrFile = filenamesBuffer;
dlg.m_ofn.nMaxFile = bufferSize;

// Create array for file names.
CString fileNameArray[ numberOfFileNames ];
if( dlg.DoModal() == IDOK )
{
    // Retrieve file name(s).
    POSITION fileNamesPosition = dlg.GetStartPosition();
    int iCtr = 0;
    while( fileNamesPosition != NULL )
    {
        fileNameArray[ iCtr ] = dlg.GetNextPathName( fileNamesPosition );
        iCtr++;
    }
}
// Release file names buffer.
delete[] filenamesBuffer;
P-39968
Dawidsoni
Temat założony przez niniejszego użytkownika
» 2011-08-26 15:33:27
Nie znam tak dobrze angielskiego, żeby wszystko zrozumieć co tam pisze, ale zrozumiałem, że po każdej nazwie pliku jest NULL. Tak naprawdę pliki zapisywały się:
C/Documents/Folder (NULL) nazwa 1.png (NULL) nazwa 2.png (NULL) ...
, czyli zapisywały się dobrze, ale ja nie wiedziałem, że tak się zapisują, bo ładowałem to do stringa, a potem wypisywałem na ekranie. Oczywiście string kończy się NULLem i na ekranie było wypisywane:
C/Documents/Folder 
Myślałem, że to jest cała zmienna i stąd mój błąd.
Napisałem sobie funkcję, która mi robi ścieżki, zwraca ich adres oraz pokazuje ile zostało wpisanych ścieżek:
C/C++
string * zmien( char FileName[], int & ile ) {
    int ile_sciezek = 0;
    int i = 0;
    for( int j = 1;; j++ ) {
        string m = "";
        while( FileName[ i ] != '\0' ) {
            m += FileName[ i ];
            i++;
        }
        i++;
        if( m == "" || m == " " ) {
            ile_sciezek = j - 2;
            break;
        }
    }
    if( !ile_sciezek )
         ile_sciezek++;
   
    i = 0;
    string m = "";
    string * wsk_sciezki = new string[ ile_sciezek ];
    while( FileName[ i ] != '\0' ) {
        m += FileName[ i ];
        i++;
    }
    i++;
    for( int ii = 0; ii < ile_sciezek; ii++ ) {
        while( FileName[ i ] != '\0' ) {
            *( wsk_sciezki + ii ) += FileName[ i ];
            i++;
        }
        i++;
        string pomocnik = *( wsk_sciezki + ii );
        if( pomocnik == "" || pomocnik == " " ) {
            break;
        }
        ( wsk_sciezki + ii )->clear();
        *( wsk_sciezki + ii ) = m + "\\" + pomocnik;
    }
    ile = ile_sciezek;
    return wsk_sciezki;
}

Wystarczyło napisać, że jest NULL po każdej nazwie:D.
Dzięki Dejavu za linka.
P-39985
« 1 »
  Strona 1 z 1