|
GetFiles and GetDirectories return an array containing all files/directories found. The methods can't return until that array has been populated. You should probably try using EnumerateFiles and EnumerateDirectories instead, and try to remove the ToArray calls.
DirectoryInfo.EnumerateFiles Method (System.IO) | Microsoft Docs[^]
DirectoryInfo.EnumerateDirectories Method (System.IO) | Microsoft Docs[^]
You're also going to want to skip "reparse-point" directories, which can have your code running around in circles.
Reparse Points - Windows applications | Microsoft Docs[^]
There's no need to pass *.* as the search pattern; just omit the parameter.
I'd be inclined to avoid the simple LINQ filters, since you're processing a lot of directories.
Try something like this:
public void ParseProfile(TreeNode parent_node, DirectoryInfo parent_di = null)
{
if (parent_di == null) parent_di = new DirectoryInfo(parent_node.Name);
try
{
foreach (DirectoryInfo dir in parent_di.EnumerateDirectories())
{
if ((dir.Attributes & FileAttributes.Hidden) != 0) continue;
if ((dir.Attributes & FileAttributes.ReparsePoint) != 0) continue;
TreeNode this_node = parent_node.Nodes.Add(dir.FullName, dir.Name, 0);
ParseProfile(this_node, dir);
}
foreach (FileInfo file in parent_di.EnumerateFiles())
{
if ((file.Attributes & FileAttributes.Hidden) != 0) continue;
parent_node.Nodes.Add(file.FullName, file.Name, 1);
}
}
catch (UnauthorizedAccessException e)
{
inaccessible.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.access);
}
catch (DirectoryNotFoundException e)
{
momentaries.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.warning);
}
catch (Exception e)
{
Log(e.Message, LOG_LEVEL.debug);
throw;
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
modified 14-Aug-19 4:24am.
|
|
|
|
|
This is definitely better. Thank you. As you say, EnumerateX methods perform much better, and the code is just nicer/cleaner.
Used a separate thread for ParseProfile, and I'm happy with the performance now.
I still have the issue when I expand the root node in the TreeView, but I think the only way I'm going to make that act any better is to populate the treeview as needed when nodes are expanded.
Again, thank you. This is a nice improvement.
modified 14-Aug-19 10:40am.
|
|
|
|
|
Harley Burton wrote: One small typo in the second foreach block if anyone is using this. (file, and f names)
Thanks - I've fixed the typo.
Harley Burton wrote: Used a separate thread for ParseProfile
If you're running it from a background thread, you might need to Invoke the methods that manipulate the tree.
How to: Make thread-safe calls to Windows Forms controls | Microsoft Docs[^]
Eg:
TreeNode this_node = (TreeNode)Invoke((Func<TreeNode, DirectoryInfo, TreeNode>)((p, d) => p.Nodes.Add(d.FullName, d.Name, 0)), parent_node, dir); and:
Invoke((Action<TreeNode, FileInfo>)((p, f) => p.Nodes.Add(f.FullName, f.Name, 1)), parent_node, file);
Harley Burton wrote: I still have the issue when I expand the root node in the TreeView, but I think the only way I'm going to make that act any better is to populate the treeview as needed when nodes are expanded.
I'd agree with that - populate a single level at a time when a directory node is expanded. You'll obviously need to add a "dummy" node to each directory node so that you can expand it.
TreeView.BeforeExpand Event (System.Windows.Forms) | Microsoft Docs[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks again. I had already handled everything to get it working as a background thread, but I WAS trying to figure out the best way to populate the treeview as needed. I was headed down the wrong path, and dummy nodes will even allow me to only display the expand element [+] on nodes with children, so that's a bonus.
|
|
|
|
|
I'm using a Visual Studio 2017 Setup project to install a Windows Service.
The Application folder's DefaultLocation is set to "[ProgramFilesFolder][Manufacturer][ProductName]"
The Manufacturer property is set to "My Company". The ProductName property is set to "My Product".
When I run this Installer, it dumps all files into the root of c:. The Manufacturer and Product folders are not created.
Anyone have any idea what's wrong?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
What is a Visual Studio 2017 Setup project?
Are you talking about InstallShield Limited Edition?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
|
Is there information about an example of a tiff file display for .net core?
|
|
|
|
|
Possibly, and Google will know where to find it.
|
|
|
|
|
I couldnt find it
|
|
|
|
|
Maybe there is no such product.
|
|
|
|
|
Ignore the server; use a Javascript solution instead:
https://github.com/seikichi/tiff.js[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I'm trying to install a .net Windows Service on a PC with WIn 10 running. Windows Defender is running, and this installation has to be done without turning it off. The setup will be called from another setup. We CAN addd the setup.exe to the list of allowed apps.
So, I've tried creating a VS installer Project by following this. It works in stat it sees to install, but the service istself doesn't appear in the Servics dialog.
So, if I manually turn on Real-Time Protection in Windows Defender and use InstallUtil, it installs fine. But with Real-Time Protection on it fails, so I'm trying to get the Installer to work.
I'm open to suggestions here.
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Have your main installer call InstallUtil to install the service.
Never mind, I didn't read carefully enough.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Kevin Marois wrote: if I manually turn on Real-Time Protection ... it installs fine. But with Real-Time Protection on it fails
Was that first "on" meant to be an "off"?
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I built a project payroll management system with vb 2012, MS Access 200 db, Crystal Report XI. In report section when I want to see a employee salary detail record for more than 2 year the report showing month year field not arranged like March_2019 than November_2016, January_2018 want to short by November_2016 than January_2018, March_2019. My access db table contain Month_Year format. So please help me to short the report.
|
|
|
|
|
NSE India wrote: So please help me to short the report.
Do you mean "sort?"
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Assuming you're storing the data in the correct data type - ie: as a date - then you need to sort by the raw date value before you format it. Otherwise, it will be sorted alphabetically, and "August 2019" will come before "January 2010".
If you're storing the data as a string instead of a date, then you don't stand a chance. Fix the data storage first.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I have a project that is referencing Newtonsoft.Json V11, but, some other assembly in my solution is is referencing Newtonsoft.Json V6.
I beleive that some 3rd party assembly is the culprit, but how do I find it? is there a tool to list all assemblies and their dependancies?
Thanks
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
|
Hello , I am currently working on a project which requires the use of a custom dll for authentication.
This dll is registered (so they told me) in the GAC of both the Production and Test environments.
The company policies state that you "shouldn't include the dll reference in your application's web.config file", that is, you shouldn't have something like :
<add assembly="" ....="" mydll=""> etc.
in your web.config, at least for this dll I am talking about. They say, since it's registered in the GAC, the application will load it anyway.
The problem is , if you don't add the assemby reference in your web .config , the application is not going to find it , no matter what they say.
Since I am sure the dll is actually registered in the GAC, my question is :
shouldn't the application be able to load the dll anyway , no matter if you add the reference in the web.config or not ?
I was convinced that, adding the reference to the project, the dll 's GAC location would be stored in the application's assembly so that the application itself would be able to find the assembly in the GAC , no matter what the working system is , given that the dll is actually registered in the working system's GAC .
But I must be wrong.
What is the real way it works ?
Thanks
Leo
|
|
|
|
|
Global Assembly Cache | Microsoft Docs[^]
MSDN wrote: The Global Assembly Cache stores assemblies specifically designated to be shared by several applications on the computer.
tiwal wrote: I was convinced that, adding the reference to the project, the dll 's GAC location would be stored The GAC location doesn't need to be stored; it is managed by the .NET environment.
You will still need to add a reference to the dll. The difference is that you no longer have to copy the dll to the local output folder (which VS does for you, usually), but that the app will use the one that is registered in the GAC.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hi Eddy thanks for answering.
You mean that I still need the <add assembly="" ...=""> tag in the application's web.config ?
Doesn't the application's assembly contain a reference itself ?
The production cluster specialists in my company scolded me for putting the <add assembly="" ..=""> tag in the web. config, but then I showed them how it would behave without it, and they were baffled ....
|
|
|
|
|
tiwal wrote: You mean that I still need the <add assembly="" ...=""> tag in the application's web.config ?
Doesn't the application's assembly contain a reference itself ? It does for WinForms; the references are part of the project-file, and compiled into the assembly. I'd assume ASP.NET does the same.
How the Runtime Locates Assemblies | Microsoft Docs[^] seems to suggest that the config-files are the first location where the runtime looks.
tiwal wrote: The production cluster specialists in my company scolded me for putting the <add assembly="" ..=""> tag in the web. config Why? Any specific reason why it is considered "bad"?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Eddy Vluggen wrote: Why? Any specific reason why it is considered "bad"?
Well I assume they, like me, were expecting everything to work fine without the need to add the specified tags to the web.config ... appearently, we both were wrong....
|
|
|
|