System.IO.Directory.GetFiles() doesn't list all files
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I am using the System.IO.Directory.GetFiles()
function to list all executable files from C:WindowsSystem32
with the following code:
using System;
using System.Collections.Generic;
using System.IO;
namespace MyProgram
{
class Program
{
static void Main(string args)
{
string files;
files = System.IO.Directory.GetFiles(@"C:WindowsSystem32", "*.exe");
}
}
}
It lists 300 executables:
But when I list all the files with PowerShell it has 446 executables:
For example: C:WindowsSystem32WinSAT.exe
.
It doesn't list this file.
Any idea why it doesn't show me the full list of executable files ? it misses some files.
c# getfiles
|
show 4 more comments
I am using the System.IO.Directory.GetFiles()
function to list all executable files from C:WindowsSystem32
with the following code:
using System;
using System.Collections.Generic;
using System.IO;
namespace MyProgram
{
class Program
{
static void Main(string args)
{
string files;
files = System.IO.Directory.GetFiles(@"C:WindowsSystem32", "*.exe");
}
}
}
It lists 300 executables:
But when I list all the files with PowerShell it has 446 executables:
For example: C:WindowsSystem32WinSAT.exe
.
It doesn't list this file.
Any idea why it doesn't show me the full list of executable files ? it misses some files.
c# getfiles
2
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
1
Please check if the number of executables provieded by your C# program matches the number of the exe files in theC:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.
– elgonzo
Nov 24 '18 at 21:30
|
show 4 more comments
I am using the System.IO.Directory.GetFiles()
function to list all executable files from C:WindowsSystem32
with the following code:
using System;
using System.Collections.Generic;
using System.IO;
namespace MyProgram
{
class Program
{
static void Main(string args)
{
string files;
files = System.IO.Directory.GetFiles(@"C:WindowsSystem32", "*.exe");
}
}
}
It lists 300 executables:
But when I list all the files with PowerShell it has 446 executables:
For example: C:WindowsSystem32WinSAT.exe
.
It doesn't list this file.
Any idea why it doesn't show me the full list of executable files ? it misses some files.
c# getfiles
I am using the System.IO.Directory.GetFiles()
function to list all executable files from C:WindowsSystem32
with the following code:
using System;
using System.Collections.Generic;
using System.IO;
namespace MyProgram
{
class Program
{
static void Main(string args)
{
string files;
files = System.IO.Directory.GetFiles(@"C:WindowsSystem32", "*.exe");
}
}
}
It lists 300 executables:
But when I list all the files with PowerShell it has 446 executables:
For example: C:WindowsSystem32WinSAT.exe
.
It doesn't list this file.
Any idea why it doesn't show me the full list of executable files ? it misses some files.
c# getfiles
c# getfiles
edited Nov 24 '18 at 21:00
E235
asked Nov 24 '18 at 20:44
E235E235
2,17232753
2,17232753
2
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
1
Please check if the number of executables provieded by your C# program matches the number of the exe files in theC:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.
– elgonzo
Nov 24 '18 at 21:30
|
show 4 more comments
2
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
1
Please check if the number of executables provieded by your C# program matches the number of the exe files in theC:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.
– elgonzo
Nov 24 '18 at 21:30
2
2
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
1
1
Please check if the number of executables provieded by your C# program matches the number of the exe files in the
C:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.– elgonzo
Nov 24 '18 at 21:30
Please check if the number of executables provieded by your C# program matches the number of the exe files in the
C:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.– elgonzo
Nov 24 '18 at 21:30
|
show 4 more comments
2 Answers
2
active
oldest
votes
I guess you are running a 64 bit operating system but try to access this directory running from a C# application compiled to 32 bit. According to Programming Guide for 64-bit Windows / Running 32-bit Applications / File System Redirector
:
The %windir%System32 directory is reserved for 64-bit applications on 64-bit Windows. Most DLL file names were not changed when 64-bit versions of the DLLs were created, so 32-bit versions of the DLLs are stored in a different directory. WOW64 hides this difference by using a file system redirector.
In most cases, whenever a 32-bit application attempts to access %windir%System32, %windir%lastgoodsystem32, or %windir%regedit.exe, the access is redirected to an architecture-specific path.
Original Path Redirected Path for 32-bit x86 Processes Redirected
%windir%System32 %windir%SysWOW64
%windir%lastgoodsystem32 %windir%lastgoodSysWOW64
%windir%regedit.exe %windir%SysWOW64regedit.exe
So you can either compile your application to x64 or access the missing files via the %windir%SysWOW64
folder.
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,Build
tab and uncheckPrefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)
– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in bothsystem32
andsyswow64
?
– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
add a comment |
GetFiles will stop when you get an exception. Exception includes access violations. Only way of getting all files is to parse directory by directory using recursion. See code below which writes results to an xml file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace WriteFileNamesXml
{
class Program
{
const string FILENAME = @"c:temptest.xml";
const string FOLDER = @"c:temp";
static XmlWriter writer = null;
static void Main(string args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462208%2fsystem-io-directory-getfiles-doesnt-list-all-files%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I guess you are running a 64 bit operating system but try to access this directory running from a C# application compiled to 32 bit. According to Programming Guide for 64-bit Windows / Running 32-bit Applications / File System Redirector
:
The %windir%System32 directory is reserved for 64-bit applications on 64-bit Windows. Most DLL file names were not changed when 64-bit versions of the DLLs were created, so 32-bit versions of the DLLs are stored in a different directory. WOW64 hides this difference by using a file system redirector.
In most cases, whenever a 32-bit application attempts to access %windir%System32, %windir%lastgoodsystem32, or %windir%regedit.exe, the access is redirected to an architecture-specific path.
Original Path Redirected Path for 32-bit x86 Processes Redirected
%windir%System32 %windir%SysWOW64
%windir%lastgoodsystem32 %windir%lastgoodSysWOW64
%windir%regedit.exe %windir%SysWOW64regedit.exe
So you can either compile your application to x64 or access the missing files via the %windir%SysWOW64
folder.
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,Build
tab and uncheckPrefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)
– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in bothsystem32
andsyswow64
?
– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
add a comment |
I guess you are running a 64 bit operating system but try to access this directory running from a C# application compiled to 32 bit. According to Programming Guide for 64-bit Windows / Running 32-bit Applications / File System Redirector
:
The %windir%System32 directory is reserved for 64-bit applications on 64-bit Windows. Most DLL file names were not changed when 64-bit versions of the DLLs were created, so 32-bit versions of the DLLs are stored in a different directory. WOW64 hides this difference by using a file system redirector.
In most cases, whenever a 32-bit application attempts to access %windir%System32, %windir%lastgoodsystem32, or %windir%regedit.exe, the access is redirected to an architecture-specific path.
Original Path Redirected Path for 32-bit x86 Processes Redirected
%windir%System32 %windir%SysWOW64
%windir%lastgoodsystem32 %windir%lastgoodSysWOW64
%windir%regedit.exe %windir%SysWOW64regedit.exe
So you can either compile your application to x64 or access the missing files via the %windir%SysWOW64
folder.
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,Build
tab and uncheckPrefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)
– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in bothsystem32
andsyswow64
?
– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
add a comment |
I guess you are running a 64 bit operating system but try to access this directory running from a C# application compiled to 32 bit. According to Programming Guide for 64-bit Windows / Running 32-bit Applications / File System Redirector
:
The %windir%System32 directory is reserved for 64-bit applications on 64-bit Windows. Most DLL file names were not changed when 64-bit versions of the DLLs were created, so 32-bit versions of the DLLs are stored in a different directory. WOW64 hides this difference by using a file system redirector.
In most cases, whenever a 32-bit application attempts to access %windir%System32, %windir%lastgoodsystem32, or %windir%regedit.exe, the access is redirected to an architecture-specific path.
Original Path Redirected Path for 32-bit x86 Processes Redirected
%windir%System32 %windir%SysWOW64
%windir%lastgoodsystem32 %windir%lastgoodSysWOW64
%windir%regedit.exe %windir%SysWOW64regedit.exe
So you can either compile your application to x64 or access the missing files via the %windir%SysWOW64
folder.
I guess you are running a 64 bit operating system but try to access this directory running from a C# application compiled to 32 bit. According to Programming Guide for 64-bit Windows / Running 32-bit Applications / File System Redirector
:
The %windir%System32 directory is reserved for 64-bit applications on 64-bit Windows. Most DLL file names were not changed when 64-bit versions of the DLLs were created, so 32-bit versions of the DLLs are stored in a different directory. WOW64 hides this difference by using a file system redirector.
In most cases, whenever a 32-bit application attempts to access %windir%System32, %windir%lastgoodsystem32, or %windir%regedit.exe, the access is redirected to an architecture-specific path.
Original Path Redirected Path for 32-bit x86 Processes Redirected
%windir%System32 %windir%SysWOW64
%windir%lastgoodsystem32 %windir%lastgoodSysWOW64
%windir%regedit.exe %windir%SysWOW64regedit.exe
So you can either compile your application to x64 or access the missing files via the %windir%SysWOW64
folder.
answered Nov 24 '18 at 21:40
Markus SafarMarkus Safar
4,82241938
4,82241938
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,Build
tab and uncheckPrefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)
– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in bothsystem32
andsyswow64
?
– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
add a comment |
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,Build
tab and uncheckPrefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)
– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in bothsystem32
andsyswow64
?
– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,
Build
tab and uncheck Prefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)– elgonzo
Nov 24 '18 at 21:43
No need to compile for x64 if the target is AnyCPU. Just go into the project settings,
Build
tab and uncheck Prefer 32-bit
(assuming x86 execution in the debugger is indeed the reason)– elgonzo
Nov 24 '18 at 21:43
@elgonzo what if I want it to search in both
system32
and syswow64
?– E235
Nov 25 '18 at 6:52
@elgonzo what if I want it to search in both
system32
and syswow64
?– E235
Nov 25 '18 at 6:52
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
@E235, i am not sure i understand your question here. If you want to search both in System32 and in SysWOW64, then search in both directories (assuming you adjusted your project settings as i mentioned in my first comment here). Also be aware that if you run your program on a 32-bit Windows version there is no SysWOW64 folder (it only exists in 64-bit Windows versions).
– elgonzo
Nov 25 '18 at 8:07
add a comment |
GetFiles will stop when you get an exception. Exception includes access violations. Only way of getting all files is to parse directory by directory using recursion. See code below which writes results to an xml file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace WriteFileNamesXml
{
class Program
{
const string FILENAME = @"c:temptest.xml";
const string FOLDER = @"c:temp";
static XmlWriter writer = null;
static void Main(string args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
add a comment |
GetFiles will stop when you get an exception. Exception includes access violations. Only way of getting all files is to parse directory by directory using recursion. See code below which writes results to an xml file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace WriteFileNamesXml
{
class Program
{
const string FILENAME = @"c:temptest.xml";
const string FOLDER = @"c:temp";
static XmlWriter writer = null;
static void Main(string args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
add a comment |
GetFiles will stop when you get an exception. Exception includes access violations. Only way of getting all files is to parse directory by directory using recursion. See code below which writes results to an xml file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace WriteFileNamesXml
{
class Program
{
const string FILENAME = @"c:temptest.xml";
const string FOLDER = @"c:temp";
static XmlWriter writer = null;
static void Main(string args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
GetFiles will stop when you get an exception. Exception includes access violations. Only way of getting all files is to parse directory by directory using recursion. See code below which writes results to an xml file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace WriteFileNamesXml
{
class Program
{
const string FILENAME = @"c:temptest.xml";
const string FOLDER = @"c:temp";
static XmlWriter writer = null;
static void Main(string args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
answered Nov 24 '18 at 21:10
jdwengjdweng
18.3k2917
18.3k2917
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
add a comment |
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
Nope. This isn't what is going on at all. If there was an exception raised that would be clear in the asker's program.
– David Heffernan
Nov 27 '18 at 4:12
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462208%2fsystem-io-directory-getfiles-doesnt-list-all-files%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
That search you show an image of (Windows Explorer) usually includes sub-folders as well?
– sellotape
Nov 24 '18 at 20:50
@sellotape oops, yes. I will fix my question.
– E235
Nov 24 '18 at 20:53
@sellotape I updated my question. Check it again.
– E235
Nov 24 '18 at 21:01
It might be a permissions issue. Are you running your program with administrative privileges?
– adam
Nov 24 '18 at 21:10
1
Please check if the number of executables provieded by your C# program matches the number of the exe files in the
C:WindowsSysWOW64
folder. Your program might be running in 32-bit x86 mode, even if it is set to AnyCPU, due to Visual Studio hosting it in a 32 bit environment.– elgonzo
Nov 24 '18 at 21:30