我用c++做了一个负责找文件并把文件路径写入一个文件储存,再用c#读取结果中文全部变为乱码
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Runtime.InteropServices; 10 using System.IO; 11 12 namespace WindowsFormsApplication3 13 { 14 public partial class Form1 : Form 15 { 16 [DllImport("F:\\FildFile.dll")] 17 private static extern void findfiler(int classfile); 18 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 24 25 private void button1_Click(object sender, EventArgs e) 26 { 27 findfiler(2); 28 StreamReader re = new StreamReader(new FileStream("F:\\mp3list.data", FileMode.Open)); 29 while(!re.EndOfStream){ 30 listBox1.Items.Add(re.ReadLine().ToString()); 31 } 32 re.Close(); 33 } 34 35 private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 36 { 37 axWindowsMediaPlayer1.URL = @listBox1.SelectedItem.ToString(); 38 } 39 } 40 }
这是C#读的内容
本人刚学程序设计半年,希望多多指点
你的文件存储是啥玩意儿?
储存所要文件的路径
@SetFont: 我就是问你文件的路径你如何存储的?也就是你的存储设施是啥?
@Launcher: 本地硬盘,用c++做的dll,就是音乐播放器,用于扫描电脑内的mp3文件,然后把所有路径写入这个文件
@SetFont: 你用 C++ 创建的文件设置 BOM 信息了吗?在你的 C++ 代码中路径字符串使用的是宽字符,还是多字节?你写入文件时是写入的 RAW 字符串,还是使用了编码?
@Launcher: 这个不是很清楚,希望指点
@SetFont: 把代码贴出来
@Launcher:
1 // FildFile.cpp : Defines the entry point for the DLL application. 2 // 3 4 #include "stdafx.h" 5 extern "C" _declspec(dllexport)void _stdcall findfiler(int classfile); 6 7 8 BOOL APIENTRY DllMain( HANDLE hModule, 9 DWORD ul_reason_for_call, 10 LPVOID lpReserved 11 ) 12 { 13 switch (ul_reason_for_call) 14 { 15 case DLL_PROCESS_ATTACH: 16 case DLL_THREAD_ATTACH: 17 case DLL_THREAD_DETACH: 18 case DLL_PROCESS_DETACH: 19 break; 20 } 21 return TRUE; 22 } 23 24 25 void FindFile(char* pfilename,char* pfilter,FILE *filepointer);//自定义函数声明 26 int count=0; //统计文件数 27 char fname[32]; //存储输入文件名 28 #define BUFSIZE 256 //驱动器名称存放缓冲区大小 29 30 31 void _stdcall findfiler(int classfile) 32 { 33 char szLogicalDriveStrings[BUFSIZE]; 34 int iSub; //驱动器数组偏移读取 35 DWORD iLength; //驱动器数组长度 36 37 switch(classfile){ 38 case 1:strcpy(fname,"exe");break; 39 case 2:strcpy(fname,"mp3");break; 40 case 3:strcpy(fname,"data");break; 41 case 4:strcpy(fname,"txt");break; 42 case 5:strcpy(fname,"mp4");break; 43 case 6:strcpy(fname,"jpg");break; 44 case 7:strcpy(fname,"rmvb");break; 45 case 8:strcpy(fname,"cs");break; 46 case 9:strcpy(fname,"cpp");break; 47 case 10:strcpy(fname,"jpeg");break; 48 } 49 50 char filetitle[50]="F:\\"; //保存文件名 51 strcat(filetitle,fname); 52 strcat(filetitle,"list.data"); 53 FILE *fp; //新建文件指针 54 if((fp=fopen(filetitle,"a+"))==NULL)return; 55 56 ZeroMemory(szLogicalDriveStrings, BUFSIZE); //清空缓冲内存 57 iLength = GetLogicalDriveStringsA(BUFSIZE-1, szLogicalDriveStrings); 58 for(iSub=0; iSub<iLength; iSub+=4) 59 { 60 if(GetDriveType(szLogicalDriveStrings+iSub)!=3)continue; 61 FindFile(szLogicalDriveStrings+iSub,"*.*",fp); 62 } 63 fprintf(fp,"%d",count); 64 fclose(fp); 65 66 return; 67 } 68 69 void FindFile(char* pfilename,char* pfilter,FILE *filepointer) 70 { 71 WIN32_FIND_DATA findfiledate; 72 HANDLE hfind; 73 char filename[512]; 74 char lpFileName[512]; 75 char _lpFileName[512]; 76 int i; 77 int result; 78 for(i=0;*(pfilename+i)!='\0';i++)filename[i]=*(pfilename+i); 79 80 filename[i]='\0'; //如果最后一个字符不是'\' 81 82 if(filename[strlen(filename)-1]!='\\') 83 strcat(filename,"\\"); //添加'\' 84 strcpy(lpFileName,filename); 85 strcat(lpFileName,pfilter); 86 hfind=FindFirstFile(lpFileName,&findfiledate); 87 if(hfind==INVALID_HANDLE_VALUE) return; 88 89 char tm[512]; 90 91 do 92 { 93 //如果不是目录 94 if(!(findfiledate.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) 95 { 96 //如果找到指定文件 97 strcpy(tm,strlen(findfiledate.cFileName)+findfiledate.cFileName-3); 98 if(0==strcmp(fname,tm)) 99 { 100 fprintf(filepointer,"%s\n",findfiledate.cFileName); 101 fprintf(filepointer,"%s%s\n",filename,findfiledate.cFileName); 102 count++; 103 } 104 } 105 //如果是目录 106 else 107 { 108 //.和..不输出 109 if(findfiledate.cFileName[0]!='.') 110 { 111 strcpy(_lpFileName,filename); 112 strcat(_lpFileName,findfiledate.cFileName); 113 FindFile(_lpFileName,pfilter,filepointer); //递归 114 } 115 } 116 }while(FindNextFile(hfind,&findfiledate));//FindNextFile返回为真,继续搜索 117 118 FindClose(hfind); 119 return; 120 }
@SetFont: C# 中怎么读的?
@Launcher: 在最上面
@SetFont: C++ 代码编译的字符集选项修改为 UNICODE,然后在 C++ 代码中将 char 都替换为 TCHAR。
@Launcher: 嗯嗯 谢谢 等我上完课我就去看看
你用C++读读看会不会乱码。
不会